访问线上平台出现http状态码“502”和“504”HTTP协议

时间:2022-11-03 18:58:03


某一天在访问线上平台的时候,突然发现进不去了,加载了好大一会先是出现“502 Bad Gateway”(网关错误), 过了一会再去访问出现“504 Gateway Time-out”(网关超时),现在就这两个状态出现的原因和解决办法进行分析。

一、出现“502”

网页显示:

访问线上平台出现http状态码“502”和“504”HTTP协议

原因:(以下都有可能,原因并不唯一)

1. upstream连接失败,可能后端服务没有开启,属于应用服务的问题(前提是接入层7层正常的情况下)。
2. SSL初始化或者握手失败,可能证书不正确
3. 发送请求时,和upstream的连接已经断掉
4. 从upstream中recv数据失败或者长度为0或者eof
5. upstream中recv的数据太大或者不是有效的HTTP header

上面的话可能一般人不理解,其中某位博主给的解释很好理解也比较准确:“后端服务器tomcat没有起来,应用服务的问题(前提是接入层7层正常的情况下)。

应用服务问题一种是应用本身问题;另一种是因为依赖服务问题比如依赖服务RT高,依赖的服务有大的读取(mysql慢查,http等),以至于调用方超过超时read时间;服务集群压力大时,也会出现502超时(502理解为不可响应或响应不过来,其实还是不可响应)。”虽然和后端服务建立联系,但是无法给予正常的响应,因此报错。

解决办法:

1.加大后端服务单个业务请求的执行的时间,具体是后端扩容或者前端限流 

场景可能是:使用者在查询数据时,本来后端跟前端是做大查询的条数是10万条,可是使用者不知道,直接查了近三年的数据,足足有1亿多条,服务分分钟就挂了

2.后端适当将php-cgi进程数设置多点,需要修改/usr/local/php/etc/php-fpm.conf 将其中的max_children值适当增加。

3.增大缓冲区

fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;

4.增大代理缓冲区

5.增加php超时时间,php.ini 中缺省的最长执行时间是 30 秒,即使morenmax_execution_time=30,适当增大这一数值

6.增加nginx等待时间:

http{
...
fastcgi_connect_timeout 300;//连接
fastcgi_send_timeout 300;//发送请求
fastcgi_read_timeout 300;//发送输出
...
}

7.后端查看并处理死掉的进程

二、出现“504”

网页显示:

访问线上平台出现http状态码“502”和“504”HTTP协议

原因:

大佬解释:

“504 gateway time-out 顾名思义 网关超时 一般计算机中的超时就是配置错了,此处一般指nginx做反向代理服务器时,所连接的服务器tomcat无响应导致的。

从网络角度,502已经与后端建立了连接,但超时;504与后端连接未建立,超时。” ​​服务器​​作为网关或代理,但是没有及时从上游服务器收到请求。上游服务器已关闭,也就是不响应网关或者代理

解决办法:

1.nginx中配置:

(1) 增大以下超时时间的值。默认都是60s。

http{
...
fastcgi_connect_timeout 300;//连接
fastcgi_send_timeout 300;//发送请求
fastcgi_read_timeout 300;//发送输出
...
}

(2) 优化性能参数设置,适当将fastcgi以下参数变大:

http {
...
fastcgi_buffer_size=128k;
fastcgi_buffers 2 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
...
}

2.php中配置:

(1)php.ini

设置max_execution_time

(2)php-fpm

通过计算适当增大max_children(php-cgi最大进程数)、request_terminate_timeout(处理脚本的超时时间)的值,

注意:以下的值并不是通用的,需要计算(​​计算详情请点击​​)

max_children 40
request_terminate_timeout 900

三、常见的HTTP协议以及http状态码:

​​HTTP协议​​

参考:

【1】​​前端报502 bad gateway的原因及解决方案​​

【2】​​http 502 和 504 的区别​​

【3】​​http状态码502与504区别​​

【4】​​如何解决“504 Gateway Time-out”错误​​

【5】​​Ngnix中的fastcgi参数性能优化和解释​​

访问线上平台出现http状态码“502”和“504”HTTP协议