服务应用和网络结构示意图
+-------+ 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/;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)