美文网首页
Nginx Http 模块中 Upstream 的 keepal

Nginx Http 模块中 Upstream 的 keepal

作者: ZhiXiong | 来源:发表于2021-06-09 21:25 被阅读0次

摘要

在高并发环境下 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

相关文章

网友评论

      本文标题:Nginx Http 模块中 Upstream 的 keepal

      本文链接:https://www.haomeiwen.com/subject/ubqeeltx.html