Nginx Http 模块中 Upstream 的 keepalive 参数配置注意事项

时间:2023年06月09日

/

来源:网络

/

编辑:佚名

在高并发环境下 keepalive 参数配置不当容易产生大量 TIME_WAIT,导致端口耗尽,服务异常。
keepalive 值应该大于等于 upstream 中 server 的数量。(建议是 server 数的 2 倍)
详细说明
keepalive 用于设置保留在每个 nginx worker 缓存中『已经与上游服务器建立的空闲连接』的最大连接数,如果超过这个值,最近最少使用的连接将被关闭。
Nginx 官方建议这个值应该尽可能小,以便让上游服务器也能处理新进入的连接。但是『尽可能小』有些太模糊,如果配置不当会降低性能以及产生其他问题。
在大量短链接(或者大量分散用户)的请求场景下,同时 upstream 为轮询模式时,因为 keepalive 值小于 upstream server 数,upstream 新的空闲连接会从缓存中挤出老的空闲链接,导致 keepalive 在某种意义上失效。
根据下面配置,以单个 nginx worker 处理请求为例,这里做个更详细的解释:
upstream http_backend {
    server 10.0.0.1;
    server 10.0.0.2;
    server 10.0.0.3;
    keepalive 2;
}
server {
    ...
    location /http/ {
        proxy_pass http://http_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        ...
    }
}
第一个请求进来,nginx 与 10.0.0.1 建立连接,请求处理完成后,nginx 与 10.0.0.1 的空闲连接被放入空闲连接池;
第二个请求进来,nginx 与 10.0.0.2 建立连接,请求处理完成后,nginx 与 10.0.0.2 的空闲连接被放入空闲连接池;
第三个请求进来,nginx 与 10.0.0.3 建立连接,请求处理完成后,因为最大空闲连接数为 2,连接数已满,所以 nginx 与 10.0.0.1 的空闲连接被 close,nginx 与 10.0.0.3 的空闲连接被放入空闲连接池;
第四个请求进来,nginx 再次与 10.0.0.1 建立连接,请求处理完成后,因为最大空闲连接数为 2,连接数已满,所以 nginx 与 10.0.0.2 的空闲连接被 close,nginx 与 10.0.0.1 的空闲连接被放入空闲连接池
。。。以此类推
这种效果就像没有配置 keepalive
挖个坑:以上内容根据实践经验以及推测而得出,待我用源码来证明 :)
参考文档:
nginx 官方文档: https://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
猜你需要

豫ICP备2021026617号-1  豫公网安备:41172602000185   Copyright © 2021-2028 www.78moban.com/ All Rights Reserved

本站作品均来自互联网,转载目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责。如有侵犯您的版权,请联系 1565229909#qq.com(把#改成@),我们将立即处理。