一、服务架构
-
服务应用和网络结构示意图
+-------+ HTTP +----------+ | | ------> | Server A | | | +----------+ +--------+ HTTP | | HTTP +----------+ | Client | ------> | Nginx | ------> | Server B | +--------+ | | +----------+ | | HTTP +----------+ | | ------> | Server C | +-------+ +----------+
二、故障描述
Nginx 所代理的后端应用程序间歇性持续出现 HTTP 502 的异常。并且是一瞬间后端多个独立部署的应用全部出现 HTTP 502 的错误
# 一瞬间Nginx检测不到任何存活的后端服务才会出现的 Nginx 错误日志
no live upstreams while connecting to upstream ...... HTTP/1.0
三、故障分析
-
网络抖动原因导致异常
-
Nginx 的配置文件是否有错误,导致 Nginx 转发异常
-
应用程序在处理某一个或者某一类请求的时候出现系统错误,导致请求阻塞,后续请求无法连接
-
检查后端独立应用负载压力是否过大,导致应用程序无法处理当前并发的业务?
[root@rambo ~]# netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}' SYN_RECV 1 ESTABLISHED 656 FIN_WAIT1 4 TIME_WAIT 153429
四、故障排除
-
故障分析结论一,检测网络是否正常,确保网络正常后是否还出现 HTTP 502 的间歇性异常。
-
故障分析结论二,那么我们应该检测 Nginx 的配置,将代理程序设置正确并重启 Nginx 服务。
-
故障分析结论三,检查应用程序日志:运行时异常?数据库处理异常?等等导致后续请求阻塞。扩展应用程序的横向部署来提高业务处理能力。
-
故障分析结论四,
TIME_WAIT
特别多,大量的连接被SERVER
侧主动关闭,这说明Nginx -> SERVER
这一步请求并没有Keep-Alive
。由于 HTTP1.0 中 Keep-Alive 默认是关闭的,需要在请求头显示加上Connection: Keep-Alive
才能启用Keep-Alive
。 但是在 HTTP1.1 中,该功能默认是开启的,需要使用Connection: Close
才会禁用Keep-Alive
。目前大部分浏览器使用的是HTTP 1.1
协议。upstream bbbbbb { server 127.0.0.1:8080 max_fails=3 fail_timeout=5s weight=1; server 127.0.0.1:8081 max_fails=3 fail_timeout=5s weight=1; # 添加 keepalive 配置 keepalive 256; }
location ^~ /aaaaaa/ { # 强制指定使用 HTTP/1.1 协议 proxy_http_vesrion 1.1; # 在请求头显示启用 Keep-Alive proxy_set_header Connection "Keep-Alive"; proxy_pass http://bbbbbbb/; }