登录 |  注册 |  繁體中文


Nginx 502 Bad Gateway,Nginx 504 Gateway Time-out 详解

分类: 服务器相关 颜色:橙色 默认  字号: 阅读(1651) | 评论(0)
1、Nginx 502 Bad Gateway 出现这个情况通常是后端主机宕机,或者说是Nginx和FastCGI进程管理器(PHP-FPM)交互时,FastCGI进程管理器(PHP-FPM)出现了异常,出错的原因一般都不是nginx的问题
 
具体原因分析:
1.1、php-fpm.conf中max_requests设置过低。 PHP-FPM有一个参数 max_requests,该参数指明了,每个children最多处理多少个请求后便会被关闭,默认的设置是500。因为php是把请求轮询给每个children,在大流量下,每个childre到达max_requests所用的时间都差不多,这样就造成所有的children基本上在同一时间被关闭。在这期间,nginx无法将php文件转交给php-fpm处理,此时负载会升至很高(关闭和开启children、nginx等待php-fpm),网卡流量也降低(nginx无法生成数据传输给客户端)
 
1.2. php-fpm request_terminate_timeout超时
request_terminate_timeout用于设置当某个php脚本运行最长时间,若超出php-fpm进程管理器强行中止当前程序,并关闭fastcgi和nginx的网络连接,然后nginx中就会出现Connection reset by peer的错误了。
 
说明: php.ini中的max_execution_time在fpm中一般是不生效的
盲目的延长request_terminate_timeout并不能解决问题,一般对于线上请求1s就已经非常长了,所以如果超时,更应该去查找哪个步骤耗时,并优化。
 
1.3. php-fpm进程出错  ( 大部分情况都是因为某些扩展的某些bug)
1.4. php.ini的memory_limit过小
1.5. nginx.conf client head buffer,fastcgi buffer size过小
 
nginx错误日志: upstream sent too big header while reading response header from upstream
 
2、Nginx 504 Gateway Time-out 的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI或没返回
具体原因分析:
2.1、 在nginx.conf keepalive_timeout时间内php-fpm没有返回结果
2.2、 php-fpm设置的过少,请求过多达到php-fpm.conf pm.max_children
2.3、nginx请求排队超时,fpm到达上限,nginx会将fpm放入请求队列,如果在keepalive_timeout时间内始终没有空闲fpm,返回504
 
nginx错误日志: upstream timed out (110: Connection timed out) while reading response header from upstream
 
3、从超时角度来讲
    3.1  如果fpm超时时间小于nginx超时时间,并且达到了超时时间的话, 也就是fpm先超时,前端会返回502
    3.2  如果nginx超时时间小于fpm超时时间,并且达到了超时时间的话, 也就是nginx先超时, 前端会返回504
 
4、以上只是可能的情况,最好的办法,还是要查看日志文件,根据日志提示,来解决问题
 



姓 名: *
邮 箱:
内 容: *
验证码: 点击刷新 *   

回到顶部