关于线上服务器大量502,504问题分析

2019/12/28 php

关于线上服务器大量502,504问题分析

状态解释

502 Bad Gateway:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。

504 Gateway Time-out:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。

下面以Nginx+php-fpm来说明502,504产生的原因

简单来说,nginx作为一个代理服务器,将请求转发到其他服务器或者php-fpm来处理

当nginx收到了无效的响应时,就返回502。

当nginx超过自己配置的超时时间,还没有收到请求时,就返回504错误。

502 Bad Gateway原因分析

上面说到nginx收到了无效的响应,什么是无效的响应呢?

1、nginx无法与php-fpm进行连接。

2、nginx在连接php-fpm一段时间后发现与php-fpm的连接被断开。

如何排查分析?

1、检查php-fpm是否启动,如果没有启动php-fpm,将出现502错误

192.168.50.1 - - [09/Jan/2019:03:17:00 +0000] "GET /admin/login HTTP/1.1" 502 575 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" "-"
Request Method: GET
Status Code: 502 Bad Gateway
Remote Address: 192.168.50.128:80
Referrer Policy: no-referrer-when-downgrade

2、检查php-fpm运行脚本是否超时,php-fpm终止了脚本的执行和执行脚本的Worker进程,nginx发现自己与php-fpm的连接断开。

php超时相关配置

php.ini max_execution_time

php-fpm.conf request_terminate_timeout

这两项都是用来配置一个 PHP 脚本的最大执行时间的。当超过这个时间时,PHP-FPM不只会终止脚本的执行,还会终止执行脚本的Worker进程。所以Nginx会发现与自己通信的连接断掉了,就会返回给客户端502错误。

php-fpm还有另外一个配置 max_children,max_children最大子进程数,在高并发请求下,达到php-fpm最大响应数,后续的请求就会出现502错误的。

测试:

vi php-fpm.conf

request_terminate_timeout = 5   

php代码执行6秒

<?php
sleep(6);
Request Method: GET
Status Code: 502 Bad Gateway
Remote Address: 192.168.50.128:80
Referrer Policy: no-referrer-when-downgrade

此外要注意的是Nginx的upstream模块中的 max_fail 和 fail_timeout 两项。有时Nginx与上游服务器(如Tomcat、FastCGI)的通信只是偶然断掉了,但 max_fail 如果设置的比较小的话,那么在接下来的 fail_timeout时间内,Nginx都会认为上游服务器挂掉了,都会返回502错误。 所以可以将 max_fail 调大一些,将 fail_timeout 调小一些。

504 Gateway Time-out 原因分析

PHP-FPM设置的脚本最大执行时间已经够长了,但执行耗时PHP脚本时,发现Nginx报错从502变为504了。这是为什么呢?

因为我们修改的只是PHP的配置,Nginx中也有关于与上游服务器通信超时时间的配置

以Nginx超时时间为30秒,PHP-FPM超时时间为60秒为例,如果php程序执行时间超过30秒,将报504错误

Nginx超时配置

	fastcgi_connect_timeout 60;
	fastcgi_read_timeout 300;
	fastcgi_send_timeout 300;

调高这三项的值,将解决Nginx 504错误问题(主要是read和send两项,默认不配置的话Nginx会将超时时间设为60秒)


Search

    Table of Contents