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

nginx,http,模块,upstream,keepalive,参数,配置,注意事项 · 浏览次数 : 0

小编点评

**Keepalive 参数配置注意事项及摘要** **注意:**Keepalive 参数在 high-concurrency 环境下使用不当可能会导致端口耗尽,服务异常。 **摘要:** * Keepalive 参数用于设置每个 nginx worker 缓存中“已经与上游服务器建立的空闲连接”的最大连接数。 * 正常情况下,Keepalive 值应该尽可能小,以便让上游服务器能够处理新进入的连接。 * 在大量短链接或大量分散用户场景下,需要设置 Keepalive 值小于 upstream server 数,因为新连接会被从缓存中挤出老连接。 * Keepalive 值设置错误会导致一些性能问题,例如连接关闭、请求延迟等。 **Keepalive 参数配置:** * **keepalive**:一个整数,表示每个 worker 缓存的最大空闲连接数。 * **server**:一个数组,包含上游服务器的 IP 地址和端口号。 **示例配置:** ```nginx 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 \"\"; ... } } ``` **注意:** * Keepalive 参数的默认值为 1,这意味着每个 worker 缓存最多能缓存 1 个空闲连接。 * Keepalive 参数的有效性取决于 upstream server 的配置。如果 upstream server 设置了 Keepalive 值,则 Keepalive 参数将失效。 * Keepalive 参数并非要设置的所有 worker 缓存,因为 Keepalive 参数仅影响新连接创建。对于已存在的连接,Keepalive 参数不会生效。

正文

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

与[转帖]Nginx Http 模块中 Upstream 的 keepalive 参数配置注意事项相似的内容:

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

Nginx Http 模块中 Upstream 的 keepalive 参数配置注意事项 摘要 在高并发环境下 keepalive 参数配置不当容易产生大量 TIME_WAIT,导致端口耗尽,服务异常。 keepalive 值应该大于等于 upstream 中 server 的数量。(建议是 ser

[转帖]Nginx 负载均衡 和 健康检查

https://www.jianshu.com/p/fbb0a81604d9 简介 从 nginx 下载, 到模块安装 关于为什么不使用 ngx_http_upstream_module 测试过 ngx_http_upstream_module 这个模块, 在应用稳定的情况下做做负载均衡还可以. 但

[转帖]最新版nginx内置变量

在配置基于nginx服务器的网站时,必然会用到 nginx内置变量 ,下面笔者将它整理成列表,把最新版本的变量列出来,以方便做配置时查询 nginx内置变量 内置变量存放在 ngx_http_core_module 模块中,变量的命名方式和apache 服务器变量是一致的。总而言之,这些变量代表着客

[转帖]Ngx_lua

http://me.52fhy.com/lua-book/chapter12.html 简介 ngx_lua 指的是 lua-nginx-module模块:通过将 LuaJIT 的虚拟机嵌入到 Nginx 的 worker 中,这样既保持高性能,又能不失去lua开发的简单特性。 OpenResty 

[转帖]Nginx HTTP模块

https://www.cnblogs.com/lizexiong/p/15039009.html 导航: 这里将Nginx的一些配置进行整合。根据导航比较容易找到对应的文档。资料来自于weixueyuan 1.Nginx核心配置详解 2.Nginx HTTP模块 3.Nginx搭建 Web服务 4

[转帖]Nginx核心配置详解

https://www.cnblogs.com/lizexiong/p/15036707.html 导航: 这里将Nginx的一些配置进行整合。根据导航比较容易找到对应的文档。资料来自于weixueyuan 1.Nginx核心配置详解 2.Nginx HTTP模块 3.Nginx搭建 Web服务 4

[转帖]Nginx代理服务器

https://www.cnblogs.com/lizexiong/p/15045187.html 导航: 这里将Nginx的一些配置进行整合。根据导航比较容易找到对应的文档。资料来自于weixueyuan 1.Nginx核心配置详解 2.Nginx HTTP模块 3.Nginx搭建 Web服务 4

[转帖]NGINX的一些SEO优化常用配置

https://www.jianshu.com/p/e55073e5ebc7 官方文档:http://nginx.org/en/docs/ 常用模块: ngx_http_core_module ngx_http_rewrite_module ngx_http_proxy_module ngx_htt

[转帖]Nginx代理获取后端用户真实IP

https://www.cnblogs.com/paul8339/p/15740137.html nginx代理后想获取用户的真实IP, 1.在http 模块内增加map模块参数: map $http_x_forwarded_for $clientRealIp { "" $remote_addr;

[转帖]nginx的map指令

一 ngx_http_map_module模块 1) map 指令是由 'ngx_http_map_module 模块'提供的,默认情况下安装 nginx 都会'安装'该模块. 2) map 的主要作用是'创建自定义变量',通过使用 nginx 的'内置'变量,去'匹配'某些特定规则;如果匹配成功则