Nginx连接管理采用预分配连接池机制,每个worker进程独享由worker_connections指定大小的ngx_connection_t数组,通过free_connections链表复用结构体,兼顾客户端与上游连接,受worker_processes和系统fd限制,内存占用与配置线性相关,连接状态机支持高效复用。

Nginx 的连接管理核心在于连接池(Connection Pool)机制,它不是动态创建销毁 TCP 连接,而是预先分配、复用和回收连接结构体,从而在高并发下保持低开销与高稳定性。
每个 worker 进程独享一个连接池
worker_connections 参数定义的是每个 worker 进程能同时处理的连接数上限,这个值直接决定该进程连接池中 ngx_connection_t 结构体数组的大小。例如设为 2048,Nginx 启动时就会为该 worker 预分配 2048 个 ngx_connection_t 实例,并用一个空闲链表 free_connections 统一管理。每次 accept 新连接或主动发起上游请求时,就从链表头部取一个结构体;连接关闭后,不释放内存,而是重置字段、放回链表供下次复用。
连接池不只是给客户端用的
同一个连接池既服务于被动连接(客户端到 Nginx),也服务于主动连接(Nginx 到上游服务)。当配置了反向代理时,一个客户端请求可能占用两个 connection:一个用于接收客户端数据,另一个用于向后端发起连接。因此实际最大并发连接数受两方面制约:
- worker_connections × worker_processes(Nginx 自身连接容量)
- 操作系统级文件描述符限制(ulimit -n),因为每个 socket 占用一个 fd
连接结构体与事件紧密绑定
每个 ngx_connection_t 对应一对读/写事件(ngx_event_t),三者通过数组下标对齐:connections[i]、read_events[i]、write_events[i] 指向同一逻辑连接。这种设计避免指针跳转,提升缓存友好性。在 64 位系统中,单个连接平均消耗约 424 字节内存(connection 结构体约 232 字节 + 读写事件各约 96 字节),调大 worker_connections 会线性增加内存占用,需结合物理内存合理设置。
连接生命周期由状态机驱动
连接并非简单“建立-使用-关闭”,而是在不同状态间流转:idle → active → reusable → closed。其中 reusable 状态表示连接已关闭但结构体仍可复用(如 keepalive 超时后),此时连接会被加入 cycle->reuseable_connections_queue 双向链表,等待被新请求快速拾取,跳过初始化开销。这种状态驱动的设计让连接复用更可控,也便于模块扩展(如 HTTP 模块通过 data 字段挂载请求上下文)。


















