Nginx Http 模块中 Upstream 的 keepalive 参数配置注意事项
在高并发环境下 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