Nginx 出现 504 Gateway Time-out 和 502 Bad Gateway 的解决办法
近期在调试代码的时候,nginx相继出现了504 Gateway Time-out 和 502 Bad Gateway 的错误。Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的php-cgi。引起这样的问题大多数情况主要是提交给php-fpm的请求未能正确反馈而导致。Nginx 502 Bad Gateway的含义
·
近期在调试代码的时候,nginx相继出现了504 Gateway Time-out 和 502 Bad Gateway 的错误。
Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的php-cgi。引起这样的问题大多数情况主要是提交给php-fpm的请求未能正确反馈而导致。
Nginx 502 Bad Gateway的含义是请求的php-cgi已经执行,但是由于某种原因没有执行完毕而导致php-cgi进程终止。php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k; # 表示设置fastcgi缓冲区为8×128k
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
(2)php-fpm.conf文件
1)根据服务器的性能尽量将max_children调大,这样就可以保证有充足的php-cgi进程可以被使用;一般来说每一个php-cgi所耗费的内存在20M左右,如果max_children=50,20M*50=1000M也就是说在峰值的时候所有PHP-CGI所耗内存在1000M以内。
2)request_terminate_timeout设置php-cgi进程处理脚本的超时时间,默认值是0s,含义是让php-cgi一直执行下去而没有时间限制。可根据你的需求和服务器的性能修改这个值,可以防止进程都被挂起,提高利用效率。
netstat -anpo | grep "php-cgi" | wc -l
如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大,将max_children调大。
(2)查看修改缓冲区容量大小
缓冲区容量过小可能会导致fastcgi进程被挂起,往往nginx默认的缓冲区容量过小,需要适当调大。
(3)查看request_terminate_timeout
如果”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误。如果正在处理的那几个php-cgi遇到了问题就会出现502 Bad gateway这个错误。
Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的php-cgi。引起这样的问题大多数情况主要是提交给php-fpm的请求未能正确反馈而导致。
Nginx 502 Bad Gateway的含义是请求的php-cgi已经执行,但是由于某种原因没有执行完毕而导致php-cgi进程终止。php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。
1. 在解决问题之前先让我们了解几个重要的参数:
(1)nginx.conf文件fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k; # 表示设置fastcgi缓冲区为8×128k
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;
(2)php-fpm.conf文件
1)根据服务器的性能尽量将max_children调大,这样就可以保证有充足的php-cgi进程可以被使用;一般来说每一个php-cgi所耗费的内存在20M左右,如果max_children=50,20M*50=1000M也就是说在峰值的时候所有PHP-CGI所耗内存在1000M以内。
2)request_terminate_timeout设置php-cgi进程处理脚本的超时时间,默认值是0s,含义是让php-cgi一直执行下去而没有时间限制。可根据你的需求和服务器的性能修改这个值,可以防止进程都被挂起,提高利用效率。
2. 解决办法
(1)查看当前的PHP FastCGI进程数是否够用netstat -anpo | grep "php-cgi" | wc -l
如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大,将max_children调大。
(2)查看修改缓冲区容量大小
缓冲区容量过小可能会导致fastcgi进程被挂起,往往nginx默认的缓冲区容量过小,需要适当调大。
(3)查看request_terminate_timeout
如果”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误。如果正在处理的那几个php-cgi遇到了问题就会出现502 Bad gateway这个错误。
(4)另外,php-fpm的默认静态处理方式会使得php-cgi的进程长期占用内存而无法释放,这也是导致nginx出错的原因之一,因此可以将php-fpm的处理方式改成apache模式。
更改之后记得要重启php-fpm和nginx。更多推荐
已为社区贡献3条内容
所有评论(0)