MENU

PHP 502 bad gateway 解决方法

July 15, 2021 • Read: 877 • 程序

起因

新装的LNMP环境怎么都跑不起来代码,一直提示502 bad gateway 本着有事找度娘的精神,我首先百度了以下,果然度娘一下帮我找到了很多网友们提供的答案,五花八门,有的说是超时时间的问题,有的说是php没有启动的问题。
作为一个程序员排查问题是必备技能之一,经过一番排查,并不是超时的问题,php也已经正常启动,那为什么会出现这样的问题呢?从php未启动的基础上我作了一个大胆的假设是不是配置的fast_cgi有问题呢?既然有了大胆的假设接下来就是小心求证的过程了。

小心求证

首先上一段为关于fast_cgi的配置代码

    location ~* \.php$ {
        fastcgi_index   index.php;
        fastcgi_pass    127.0.0.1:9000;

        include           fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
    }

乍看是没什么毛病毕竟网上千篇一律的都是这样的配置,接下我使用netstat -tlnp | grep 9000 筛选了一下监听9000的程序然而结果却出乎意料,并没有监听9000的程序,结果如下

(Not all processes could be identified, non-owned process info

到这里几乎已经很大几率是出现在配置上了,查询了一下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生成,类型是srw-rw—-.

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
而此次出现问题的原因在于,我使用的是UNIX Domain Socket而nginx配置的确实tcp方式,既然知道症结所在,修改起来也就方便很多了修改代码如下

    location ~* \.php$ {
        fastcgi_index   index.php;
        #fastcgi_pass    127.0.0.1:9000; 注释掉tcp方式
        fastcgi_pass    unix:/dev/shm/php-cgi.sock;#使用UNIX Domain Socket
        include           fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
    }

修改完配置之后,重启服务器,问题果然就解决了.

回到上个页面 QR Code
QR Code for this page
Tipping QR Code
Leave a Comment

3 Comments
  1. 哟

    这里可以直接回复!::(你懂的)

    1. 哟

      @哟能不能点链接?

    2. @哟::(哈哈)