收到实施小组对现场的反馈。3天时间内,不间断的出现502错误。问题出现的时间和情况并不固定。在第3天时间出现了长达5分钟的502异常问题,以下是进行排查的过程。(最终结果有点奇葩)
推测一:nginx服务器负载过高
登入服务器检查nginx,发现整体服务器负载正常。内存和CPU均未出现过高情况,但是在查看进程中发现有4个is shutting down的nginx进程。
采用nginx重启的方式消除了4个is shutting down的进程但是还是存在问题,通过百度发现4个奇怪的进程是由于重新加载nginx配置导致的,指令如下:
#查看nginx进程
ps -aux | grep nginx
#关闭nginx
cd /usr/local/nginx/sbin
./nginx -s stop
#启动nginx
./nginx -s reload
推测二:nginx默认使用http1.0协议无法支持keepalive(有人通过这个配置可以解决)
再往上找资料发现,nginx默认使用的http1.0协议,tomcat默认的是http1.1,需要在转发时修改配置添加以下代码:
location / {
proxy_pass http://.......;
proxy_redirect ~^http://([^:]+)(:\d+)?(.*)$ https://$1$3;
##添加下两行代码
proxy_http_version 1.1;
proxy_set_header Connection "";
##下面的配置根据实际需要
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
推测三:网络故障
检查服务器网络发现,在出现502错误的时候,通过nginx所在机器telnet对应服务的端口时断时续,感觉问题就是在网络上。于是赶紧联系服务器管理方,最后进过排查无问题。
此处需要告诉大家,在telnet服务时候如果不通不要着急断定,可以先通过ping或者ssh试一下。【丢脸丢大了】
实际情况:
最后检查发现是目标服务器上的tomcat的内存占用过高。检查服务器发现配置为4U8G的服务器,tomcat配置为8G,直接顶配了。一开始没怀疑这个问题是因为跟踪日志一直不报内存溢出,服务还能时断时续的运行,完全没有怀疑是tomcat的问题。
然后将服务器内存将配,重启后恢复正常。
推测可能性
tomcat内存占用过高,系统没有主动杀死应用进程,但是应用占用了系统的运行空间,导致饮用通道堵塞,双方应该在争抢资源。