解决502、504错误

我们以php-fpm为例来分析一下问题的所在。我们在一开始就说了,由于后端的服务器发生故障,php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,以及Nginx端FastCGI缓存使用情况(如果你使用的代理,那么要注意代理缓存的使用情况),那么我们就要从这些问题入手来了解一下问题的所在。

    首先需要确定的是后端服务器启动没有,当然在这里就是php-fpm进程启动没有,如果该进程没有启动,或者是因为某种原因出错而退出,那么得到访问结果肯定是“502 Bad Gateway”了:

[root@mail php5.3.4]# ps -ef|grep php-fpm
root 15375   1  0 12:46 ?   00:00:00 php-fpm: master process (/usr/local/php5.3.4/etc/php-fpm.conf)
nobody   15376 15375  0 12:46 ?        00:00:00 php-fpm: pool www
……      //省略
nobody   15380 15375  0 12:46 ?        00:00:00 php-fpm: pool www
nobody   15381 15375  0 12:46 ?        00:00:00 php-fpm: pool w3
nobody   15382 15375  0 12:46 ?        00:00:00 php-fpm: pool w3
……      //省略
nobody   15385 15375  0 12:46 ?        00:00:00 php-fpm: pool w3
    

其次是确定一下php-fpm的worker进程是否够用,如果不够用,对于访问来说就如同后台服务没有开启:

计算开启的worker进程数目:
     
[root@mail php5.3.4]# ps -ef |grep php-fpm |wc -l
122
    
然后再将这个再减去2(一个是主进程master,另一个是这里的grep)就是你开启的php-fpm的worker进程了。当然,如果你不嫌麻烦的话,你可以用如下的命令:

[root@mail php5.3.4]# ps -ef |grep php-fpm |grep -v "master"|grep -v "grep"|wc -l
120

计算被使用的worker进程(正在处理请求的进程):

[root@mail php5.3.4]# netstat -anp|grep php-fpm|wc -l
124
    
然后再把这个值至少减去2或是更多 (一个是监听LISTEN,两个是php-fpm.conf),LISTEN的个数要看使用进程池的数量,例如,在这里我们开启的是两个进程池www和w3。如果不怕麻烦那么执行一下命令更好:

[root@mail php5.3.4]# netstat -anp | grep "php-fpm"|grep -v "LISTEN"|grep -v "php-fpm.conf"|wc -l
120
    
如果这两个值相近那么可以考虑增加worker进程的数量。

    第三,FastCGI缓冲(buffer)或是代理的缓冲情况。在FastCGI模块中,与缓冲有关的指令有一下两条:
    
fastcgi_buffer_size  4k
fastcgi_buffers   16 4k
    
对于第一条指令的设置,因为它依赖于操作系统对内存页面的设置,这个可以从操作系统查出来:

[root@s8 ~]# getconf PAGESIZE
4096
    
    这个数值单位是字节(byte),也就是说4k。

第二条指令的参数指定将使用多大的缓冲区来读取从FastCGI进程到来应答头,这个值由这两条命令的结果是:16*4k=64k决定,因此,这意味着所有FastCGI返回的应答,nginx将超过64k的部分写入磁盘,而64k以内的部分写入内存。 如果你设置的等待时间太短、机器又繁忙,势必会造成502问题。

    如果是要的是代理模块,那么会是以下的设置:

proxy_buffer_size  16k;
proxy_buffers      4 16k;

    
对于解释方法等同于FastCGI缓冲,就不再多说了。

    第四,php执行时间长。在FastCGI模块中,与时间设置有关的指令有三条,对于这个问题不便举例,这里举一个比较极端的例子,假如你将fastcgi_send_timeout的值设置为1秒,而实际需要5秒才能完成操作,那么这种情况下肯定就是502了,因此,你需要根据实际情况来调整以下三个指令的值:
    

fastcgi_connect_timeout 60;
fastcgi_send_timeout   60;
fastcgi_read_timeout   60;

    
不同网站应用的内容不同,要求也不同,因此只能根据应用适当的修改这三条配置指令。

    如果是使用代理模块,那么相关的设置如下:

proxy_connect_timeout 60;
proxy_send_timeout    60;
proxy_read_timeout    60;

fail_timeout          30;


以上的命令意思和fastcgi模块的相似,就不再多讲了。

其中最后一条是upstream模块的指令,如果使用了负载均衡,那么参考一下该指令的使用设置。

最后,作为一种学习和参考的方法,要经常去查看php-fpm的日志,特别是在出问题的时候,要将日志的级别调整为“DEBUG”级别,以便了解问题的出处。

转载于:https://www.cnblogs.com/kaixin110/archive/2013/01/10/2854106.html

你可能感兴趣的:(解决502、504错误)