免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6497 | 回复: 1
打印 上一主题 下一主题

[Web] 解决502、504错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-25 10:53 |只看该作者 |倒序浏览
我们以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”级别,以便了解问题的出处。

论坛徽章:
0
2 [报告]
发表于 2011-02-25 11:32 |只看该作者
分析得不错  谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP