某一天在访问线上平台的时候,突然发现进不去了,加载了好大一会先是出现“502 Bad Gateway”(网关错误), 过了一会再去访问出现“504 Gateway Time-out”(网关超时),现在就这两个状态出现的原因和解决办法进行分析。
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 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协议
参考:
【1】前端报502 bad gateway的原因及解决方案
【2】http 502 和 504 的区别
【3】http状态码502与504区别
【4】如何解决“504 Gateway Time-out”错误
【5】Ngnix中的fastcgi参数性能优化和解释