connection_pool_size 是 nginx 中唯一控制连接级内存池初始容量的指令,仅在新 tcp 连接建立时生效,影响请求头解析等小对象分配,需结合 client_header_buffer_size 等参数协同优化。

connection_pool_size 是 Nginx 中唯一能直接控制连接级内存池初始容量的配置指令,它不改变底层内存块(4095 字节)的硬编码大小,但能显著影响高频小对象分配时的扩容频率和内存碎片程度。
这个值调得合适,能让每个 TCP 连接刚建立时就预分配够用的内存,避免反复调用 ngx_palloc_block 扩容;调得过大,则空闲内存浪费明显,尤其在长连接多、并发高的场景下会推高整体 RSS 占用。
connection_pool_size 的作用范围与生效时机
- 仅在 新 TCP 连接建立时 初始化一个
ngx_pool_t,其起始容量由该指令决定; - 它影响的是连接结构体(
ngx_connection_t)生命周期内的所有小内存申请,比如读取请求头、解析 URI、临时变量等; - 不影响请求级内存池(如
request_pool_size)、响应缓冲区或上游连接池; - 配置位置只能在
http或server块中,不能写在location里。
示例:
http {
connection_pool_size 1024;
server {
listen 80;
# 此处继承 http 块的 connection_pool_size
}
}
如何根据实际负载合理设置 connection_pool_size
- 默认值是 256 字节,对轻量 HTTP/1.0 短连接基本够用;
- 对 HTTP/1.1 长连接、启用了
keepalive、或客户端 header 较大(如带 JWT、大量 Cookie)的场景,建议设为 512~4096; - 如果你观察到
nginx -s reload后 RSS 内存持续上升、且pstack显示大量ngx_palloc_block调用,说明频繁扩容,可尝试增大; - 每个连接对应约 424 字节基础结构开销(含事件结构体),
connection_pool_size是额外叠加的“可用池空间”,不是总内存。
常见推荐值参考:
- 普通 Web 服务(静态+简单 API):512~1024
- JWT 鉴权 + 多 Header + 长 Keepalive:2048~4096
- 极简嵌入式网关(低内存设备):128~256(需配合更激进的超时策略)
配合其他参数协同优化内存使用
单靠 connection_pool_size 不足以解决整体内存压力,需结合以下几项:
-
client_header_buffer_size和large_client_header_buffers:防止 header 解析时触发连接池外的大块 malloc; -
client_body_buffer_size:控制 POST body 缓冲,避免临时文件 IO 和额外 pool 分配; -
worker_connections:该值越大,连接总数越多,connection_pool_size × worker_connections × worker_processes就是连接池内存理论峰值; -
reset_timedout_connection on:及时回收异常连接,释放其占用的 pool 及关联资源; -
keepalive_timeout和keepalive_requests:限制长连接存活时间和请求数,间接减少 pool 长期驻留。
例如一个典型生产配置片段:
http {
connection_pool_size 2048;
client_header_buffer_size 2k;
large_client_header_buffers 4 4k;
client_body_buffer_size 16k;
events {
worker_connections 10240;
}
server {
keepalive_timeout 30;
keepalive_requests 100;
}
}
注意事项与常见误区
-
connection_pool_size设置后不会动态调整,每个连接都按此值初始化,哪怕后续只用到几十字节; - 它不控制最大上限——内存池可自动扩容,只是扩容代价比预分配高;
- 不要把它和
worker_connections混淆:后者管连接数量,前者管单个连接的初始内存池大小; - 修改后需
nginx -s reload生效,但已有连接不受影响,新连接才使用新值; - 若开启
http_v2,因头部压缩和流复用机制不同,对连接池压力略低于 HTTP/1.x,可适当保守设置。
不复杂但容易忽略。











