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

Posted 尔嵘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了访问线上平台出现http状态码“502”和“504”相关的知识,希望对你有一定的参考价值。

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

一、出现“502”

网页显示:

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

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”

网页显示:

原因:

大佬解释:

“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状态码的含义及502, 503和504的区别

Nginx502状态码处理

Nginx 抓包让你搞清楚 502 和 504 的区别

服务器错误码500 501 502 503 504 505 详解

nginx http 502 503 504区别 · T

网站502与504错误分析