开发者社区> 问答> 正文

Nginx提示502和504错误的终极解决方案

一、错误提示说明:
Nginx 502 BadGateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止。
Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI。
二、错误提示原因分析:
解决这两个问题其实是需要综合思考的,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关,
而Nginx 504 Gateway Time-out则是与nginx.conf的设置有关。
php-fpm.conf有两个至关重要的参数,一个是”max_children”,另一个是”request_terminate_timeout”,但是这个值不是通用的,而是需要自己计算的。

计算的方式如下:
如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502Bad gateway这个错误。
而”max_children”这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。
三、临时解决办法:
综上所述,Nginx提示502和504错误的临时解决办法是:
1、调整php-fpm.conf的相关设置:
<value name=”max_children”>32</value>
<value name=”request_terminate_timeout”>30s</value>
2、调整nginx.conf的相关设置:
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 256k;
fastcgi_buffers 16 256k;
fastcgi_busy_buffers_size 512k;
fastcgi_temp_file_write_size 512k;
四、终级解决方案:
标题3中所示的解决方案只能临时解决问题,而如果网站的访问量确实非常非常大,而Nginx FastCGI只能对处理瞬间或短时间内的高并发有很好的效果,所以目前唯一的终极解决方案是:定时平滑重启php-cgi。
具体配置如下:
1、写一个非常简单的脚本:
#vi /home/www/scripts/php-fpm.sh
内容如下:
#!/bin/bash
# This script run at */1
/usr/local/php/sbin/php-fpm reload
2、将脚本添加至计划任务:
#crontab -e
内容如下:
*/1 * * * */home/www/scripts/php-fpm.sh注:为了省事起见,也可以不写脚本,直接在crontab里写入php-fpm的平滑重启命令。

展开
收起
qilu 2012-04-30 20:14:24 17276 0
5 条回答
写回答
取消 提交回答
  • ReNginx提示502和504错误的终极解决方案
    请问楼主,我的服务器四核8G内存,10M带宽,应该如何设置呢
    我的目前是:
    [global]
    pid = /usr/local/php/var/run/php-fpm.pid
    error_log = /usr/local/php/var/log/php-fpm.log
    log_level = notice

    [www]
    listen = /tmp/php-cgi.sock
    listen.backlog = -1
    listen.allowed_clients = 127.0.0.1
    listen.owner = www
    listen.group = www
    listen.mode = 0666
    user = www
    group = www
    pm = static
    pm.max_children = 100
    request_terminate_timeout = 300
    request_slowlog_timeout = 0
    slowlog = var/log/slow.log
    2016-06-12 10:45:53
    赞同 展开评论 打赏
  • 回 3楼(木子90) 的帖子
    php-fpm.conf 所在的位置:- /usr/local/php/etc/php-fpm.conf
    2015-01-20 11:53:43
    赞同 展开评论 打赏
  • ReNginx提示502和504错误的终极解决方案
    php-fpm.conf  在哪个位置
    2015-01-18 11:42:18
    赞同 展开评论 打赏
  • 引用第1楼xjjyho于2012-05-01 16:07发表的  :
    用到自己的网站之中,正是因为没有注意到其他方面的细节问题结果导致很多朋友在优化过程中不断的出现关键词选择错误,频繁的修改标题类似种种低级错误,结果导致被搜素引擎所惩罚,如何有效的在网站刚刚建立的时候杜绝这些不必要的问题,笔者下面为大家分析一下网站建设之初新手朋友切记的几个要点。  第一,网站服务器缘故。表现最明显的是为了急于求成,加上本身经济问题为了贪图便宜,购买价格较低质量不稳定的虚拟空间,这些空间从短期来看的确因为其价格原因非常诱人,是可以考虑选择,因为笔者之前也是在最开始的时候购买

      兄台说的很对
    2012-05-01 17:38:00
    赞同 展开评论 打赏
  • 用到自己的网站之中,正是因为没有注意到其他方面的细节问题结果导致很多朋友在优化过程中不断的出现关键词选择错误,频繁的修改标题类似种种低级错误,结果导致被搜素引擎所惩罚,如何有效的在网站刚刚建立的时候杜绝这些不必要的问题,笔者下面为大家分析一下网站建设之初新手朋友切记的几个要点。  第一,网站服务器缘故。表现最明显的是为了急于求成,加上本身经济问题为了贪图便宜,购买价格较低质量不稳定的虚拟空间,这些空间从短期来看的确因为其价格原因非常诱人,是可以考虑选择,因为笔者之前也是在最开始的时候购买
    2012-05-01 16:07:17
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
《Nginx 代理系统常用手册》 立即下载
CentOS Nginx PHP JAVA 多语言镜像使用手 立即下载
CentOS Nginx PHP JAVA多语言镜像使用手册 立即下载