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的含义是请求的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。

你可能感兴趣的:(nginx)