• 记录一次nginx502/504问题解决过程


    最近自己在阿里云购买有段时间的服务器,一访问就出现nginx 504 Gateway Time-out。

    想起以前是可以访问的,细想最近改动的配置应该不会涉及到这块啊。

    就网上各种百度谷歌,最后终于找到解决办法,这里记录一下。

    Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI。

    nginx.conf配置如下:

    1 location ~ .php$ {
    2     root html;
    3     fastcgi_pass 127.0.0.1:9000;
    4     fastcgi_index index.php;
    5    fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    6    include fastcgi_params;
    7 }

    查看80端口使用情况,一切正常:

    再看9000端口,显示没有被占用,说明nginx配置没起作用:

     从网上查询得知,Nginx和PHP-FPM的进程间通信有两种方式,一种是TCP,一种是UNIX Domain Socket,而我当前用的是第一种。

    其中TCP是IP加端口,可以跨服务器.而UNIX Domain Socket不经过网络,只能用于Nginx跟PHP-FPM都在同一服务器的场景.用哪种取决于你的PHP-FPM配置:
    方式1:
    php-fpm.conf: listen = 127.0.0.1:9000
    nginx.conf: fastcgi_pass 127.0.0.1:9000;
    方式2:
    php-fpm.conf: listen = /tmp/php-fpm.sock
    nginx.conf: fastcgi_pass unix:/tmp/php-fpm.sock;
    其中php-fpm.sock是一个文件,由php-fpm生成

    UNIX Domain Socket可用于两个没有亲缘关系的进程,是目前广泛使用的IPC机制,比如X Window服务器和GUI程序之间就是通过UNIX Domain Socket通讯的.这种通信方式是发生在系统内核里而不会在网络里传播.UNIX Domain Socket和长连接都能避免频繁创建TCP短连接而导致TIME_WAIT连接过多的问题.对于进程间通讯的两个程序,UNIX Domain Socket的流程不会走到TCP那层,直接以文件形式,以stream socket通讯.如果是TCP Socket,则需要走到IP层,对于非同一台服务器上,TCP Socket走的就更多了。

    UNIX Domain Socket:
    Nginx <=> socket <=> PHP-FPM
    TCP Socket(本地回环):
    Nginx <=> socket <=> TCP/IP <=> socket <=> PHP-FPM
    TCP Socket(Nginx和PHP-FPM位于不同服务器):
    Nginx <=> socket <=> TCP/IP <=> 物理层 <=> 路由器 <=> 物理层 <=> TCP/IP <=> socket <=> PHP-FPM 

    再看php-fpm.conf中配置,果然也是在监听9000端口:

    listen = 127.0.0.1:9000

    现在要做的是更改nginx.conf的配置,并新增fastcig_buffers更新request到来时nginx设置的缓冲区大小:

            location ~  .php$
            {
                    root html;
                    #fastcgi_pass 127.0.0.1:9000;
                    fastcgi_pass unix:/tmp/php-fpm.sock;
                    fastcgi_index index.php;
                    fastcgi_buffers      4 128K;
                    fastcgi_buffer_size  128K;
                    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    include fastcgi_params;
            }

    同时将php-fpm.conf中配置修改:

    ;listen = 127.0.0.1:9000
    listen = /tmp/php-fpm.sock

    分别重启nginx和php-fpm后,输入地址回车,久违的echo输出终于出现:

    配置更改调试主要参考一下链接:

    https://blog.csdn.net/ucmir183/article/details/80240112

    http://blog.51cto.com/13447608/2166462

    https://www.cnblogs.com/php-linux/p/5962561.html

  • 相关阅读:
    引用kernel32.dll中的API来进行串口通讯
    vs2017 项目生成时不产生xml文件的方法
    session的处理机制
    用户未登录或Session超时时重定向到登录页,不那么简单
    VS C# debug文件夹中各文件的作用
    Tomcat(免安装版)的安装与配置【转】
    关于C#关闭窗体后,依旧有后台进程在运行的解决方法
    DatakeyNames和datakey
    ASP.NET页面生命周期描述
    比较C#中几种常见的复制字节数组方法的效率
  • 原文地址:https://www.cnblogs.com/wscsq789/p/10016876.html
Copyright © 2020-2023  润新知