Nginx提示502和504错误的解决方法

发布时间:2019-08-11编辑:脚本学堂
这篇文章介绍了nginx中提示502与504错误问题的解决办法,有遇到类似问题的朋友参考下,希望对大家有一定的帮助。

在我的一台服务器中,运行nginx,当服务器端要执行长时间的PHP脚本时,客户端容易出现nginx 504 Gateway Time-out
 
php-fpm中主要修改参数:
 

 <value name="max_children">128</value> //每一个消耗大约20M内存,根据内存大小设置
 <value name="max_requests">1024</value> //每个max_children进程若超过这个数目,就自动杀死,以后用到会自动重建。一般设置1000左右。
 <value name="request_terminate_timeout">0s</value> //如果服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。做不到这点的话,PHP-CGI可能出现某个BUG,或带宽不够充足,或其他原因导致PHP-CGI能够假死。

建议给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。
一般来说性能越好,可以设置越高,20分钟-30分钟都可以。
由于PHP脚本需要长时间运行,有的可能会超过10分钟,因此设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。
nginx中主要修改参数
 

 fastcgi_connect_timeout 1800;
 fastcgi_send_timeout 1800;
 fastcgi_read_timeout 1800;
 fastcgi_buffer_size 1024k;
 fastcgi_buffers 32 1024k;
 fastcgi_busy_buffers_size 2048k;
 fastcgi_temp_file_write_size 2048k;

 注:两个1024k值必须相等,否则报错。

以下是默认参数:
 

fastcgi_connect_timeout 300;
 fastcgi_send_timeout 300;
 fastcgi_read_timeout 300;
 fastcgi_buffer_size 64k;
 fastcgi_buffers 4 64k;
 fastcgi_busy_buffers_size 128k;
 fastcgi_temp_file_write_size 128k;

一、错误提示说明:
Nginx 502 Bad Gateway的含义是请求的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” ,引值需要自己计算出来。
 
三、临时解决办法:
综上所述,Nginx提示502和504错误的临时解决办法是:
1、调整php-fpm.conf的相关设置:
 

复制代码 代码示例:
<value name=”max_children”>128</value>
<value name=”request_terminate_timeout”>900s</value>

2、调整nginx.conf的相关设置:
 

复制代码 代码示例:
fastcgi_connect_timeout 600;
 fastcgi_send_timeout 600;
 fastcgi_read_timeout 600;
 fastcgi_buffer_size 256k;
 fastcgi_buffers 4 256k;
 fastcgi_busy_buffers_size 512k;
 fastcgi_temp_file_write_size 512k;

四、终级解决方案:
如果网站的访问量确实非常非常大,而Nginx+FastCGI只能对处理瞬间或短时间内的高并发有很好的效果。

终极的解决方案就是:定时平滑重启php-cgi。
 
具体配置:
1、创建 shell 脚本:
#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