浏览 5.8k
在生产环境遇到一个这样的现象,求解:
网络架构是nginx双机集群(1和2),代理一组upstream双机(A和B),http服务
nginx配置(设置了keepalive,是为了解决压测报错的问题):
upstream www{
ip_hash;
server 192.168.1.1;
server 192.168.1.2;
keepalive 1000;
check interval=3000 rise=2 fall=5 timeout=15000 type=http;
check_http_send "HEAD / HTTP/1.1\r\nHost: 127.0.0.1\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
listen 80 default_server;
client_max_body_size 50M;
location / {
expires -1;
proxy_pass http://www;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Connection "";
proxy_http_version 1.1;
}
故障现象:
这组服务出现了少量的响应慢请求,大约占10%,查看nginx日志,显示为502,有的是upstream返回的超时502(upstream_status),也有的直接是nginx返回的502
对应的错误日志有2类,一类是 upstream prematurely closed connection while reading response header from upstream,另一类是 no live upstreams while connecting to upstream,但是这组upstream并没有完全down掉,从健康检查看,状态一直是up的(用了upstream check module),而且90%的请求还是可以正常响应的。
处理过程:
1. nginx管理员查看了nginx处理的请求数以及cpu、内存等指标,均平稳
2. 应用管理员检查了upstream serverA和B,未见异常日志,也没重启服务
3. 尝试reload了其中一台nginx(1),故障现象消失
原因猜测:
从整个处理过程看,感觉像是nginx与upstream server之间的连接达到了瓶颈,通过reload一台nginx后,释放了一些现有连接,从而恢复正常。 但是管理员查看了nginx和upstream server双机的messages,都未看到与连接数相关的报错信息。
另一方面,根据我对reload的粗浅了解,它只是在结束已有连接后,对新建的连接重新加载配置文件,此次在处理过程中reload时并未修改相关服务的nginx配置,不知道它是否会释放与upstream的keepalive连接。短连接应该是完成后立刻中断的,我理解应该不会影响。
如果不是我猜测的这种原因,还可能是什么原因引发的这个现象呢?
诚心求解,非常感谢!
使用keepalive建立长连接池:
upstream http_backend {
server 127.0.0.1:8080;
keepalive 16;
}
server {
...
location /http/ {
proxy_pass http://http_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
...
}
}
微信公众号
加入微信群