nginx的连接池是预分配+状态管理的资源复用机制,非传统内存池;启动时按worker_connections预分配ngx_connection_t数组及空闲链表,获取时从链表摘取并重置,关闭后仅归还结构体、重置字段并销毁其专属内存池。

nginx 的 ngx_connection_t 连接池不是传统意义上的“内存池”,而是基于预分配 + 状态管理的连接资源复用机制。它的初始化和回收逻辑紧密耦合在事件循环、监听端口创建、以及连接生命周期管理中,核心目标是避免频繁 malloc/free,提升高并发下连接建立与释放的效率。
连接池的初始化:从 cycle->connections 开始
nginx 启动时,在 ngx_init_cycle() 阶段完成连接池的“静态分配”:
- 根据配置项
worker_connections(如 1024),为每个 worker 进程预分配一块连续内存,存放ngx_connection_t数组,即cycle->connections; - 同时分配等长的空闲连接链表
cycle->free_connections,初始时所有连接结构体都处于空闲态,被串成单向链表; - 每个
ngx_connection_t的data字段初始化为NULL,read/write事件结构体也一并初始化(但未挂载到 epoll/kqueue); - 注意:此时 socket fd 为 -1,
fd字段无效,真正绑定 fd 是在 accept 或 connect 成功后。
连接的获取:从 free 链表摘取并重置状态
当新连接到来(如 accept() 返回 fd),nginx 调用 ngx_get_connection() 获取一个可用连接:
- 从
cycle->free_connections头部摘下一个ngx_connection_t节点; - 重置关键字段:清空
data、重置读写事件的ready/active/pending等标志位; - 将 fd 赋值给
c->fd,设置c->log和c->pool(通常复用该连接专属的内存池); - 调用
ngx_set_connection()设置 socket 选项(如 TCP_NODELAY)、非阻塞模式,并将读事件注册到事件驱动模块(如 epoll_add_event)。
连接的回收:不销毁,只归还 + 重置
连接关闭(主动 close 或对端 FIN/RST)后,并不释放 ngx_connection_t 内存,而是执行“软回收”:
- 调用
ngx_free_connection(c),将该连接结构体重新插入cycle->free_connections链表头部; - 重置
c->fd = (ngx_socket_t) -1,清空c->data、c->addr_text等业务相关字段; - 读写事件的回调函数(
handler)被置为NULL,防止后续误触发; - 若该连接曾分配过独立内存池(
c->pool),则在此时调用ngx_destroy_pool(c->pool)彻底释放其申请的内存——这是唯一真正的内存释放点。
连接池的边界与注意事项
连接池大小固定,不可动态扩容,超限行为由上层控制:
- 若
free_connections为空,ngx_get_connection()返回 NULL,nginx 记录 error log 并直接关闭新请求(返回 503 或丢弃 SYN); - 连接池仅管理
ngx_connection_t结构体本身,不管理 socket fd 的生命周期(fd 由系统管理,需显式 close); - HTTP/1.1 keepalive 连接在 idle 超时后,会调用
ngx_close_idle_connection()归还连接池,但保持 fd 打开直到真正关闭; - SSL 连接因涉及握手上下文,其
c->ssl字段需在回收前调用SSL_free()显式清理。

















