回答
收藏
分享
举报
nginx reload会重建跟upstream的keepalive连接吗?
提问于2022-02-18 09:55

浏览 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连接。短连接应该是完成后立刻中断的,我理解应该不会影响。

如果不是我猜测的这种原因,还可能是什么原因引发的这个现象呢?

诚心求解,非常感谢!


已修改于2023-03-17 02:13



写下您的回答
发表回答
全部回答(1)

按点赞数排序

按时间排序

ngx时多进程架构的,reload会关闭当前进程,所以会断开keepalive的连接的。第一类问题如果出现频率比较高,可能是upstream服务或者中间网络某个环节有问题,第二类跟check模块有关,不是很了解。能复现的话建议抓包看看。

赞同

0

回复举报

回答于2022-02-28 23:10



回复qx5147
回复
茶客回复了

谢谢回复

0

回复举报

回答于2022-03-11 09:34



回复茶客
回复
提问者
茶客
这家伙很懒还未留下介绍~
0
文章
4
问答
0
粉丝
相关问答

是关于C模块开发的吗? 如果是的话,不列出代码是很难了解清楚问题的🙂

点赞 0
浏览 3.8k

使用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 "";
        ...
    }
}
点赞 0
浏览 5.1k

我重新下载openresty1.19.3.2

同样的操作也成功了,


点赞 0
浏览 7.4k