nginx连接复用是并发能力的底层支柱,通过keepalive机制、epoll事件驱动、tcp与应用层协同探活及内存池复用,实现单worker数万并发连接。

Nginx 事件驱动架构下,连接复用不是“省事”的附加功能,而是并发能力的底层支柱——它把单个 worker 进程能稳定支撑的并发连接数从几千直接推到数万,关键在于“复用”二字背后一整套无等待、零轮询、低开销的协同机制。
客户端连接靠 keepalive + 精确超时管理
浏览器发起的 HTTP/1.1 请求默认带 Connection: keep-alive,Nginx 抓住这一点,不急着断开 TCP 连接:
- keepalive_timeout 控制空闲连接保留时间(如设为 60s),超时由红黑树定时器自动触发关闭,不占 CPU、不启线程
- keepalive_requests 限制单连接最大请求数(如 1000),防状态累积和内存泄漏
- 连接空闲时,epoll 完全不唤醒 worker;只有新数据到达或超时事件就绪,才触发处理
上游连接靠 keepalive 池 + 事件调度复用
反向代理场景中,Nginx 与后端(如 PHP-FPM、Java 应用)之间的连接同样复用,但逻辑更主动:
- upstream 块中配置 keepalive 32,表示每个 worker 最多缓存 32 个空闲长连接,这些连接首次使用后进入 epoll 监听队列
- 新请求来时,直接从池中取连接发请求;若发送缓冲区满或后端未响应,立刻挂起并注册 write event,转去处理其他就绪任务
- 空闲连接持续监听可读状态;后端响应一到或连接关闭,事件立即触发清理或复用,无需后台线程扫描
TCP 层与应用层协同保障复用可靠性
复用的前提是连接真实可用。Nginx 不被动等错误,而是多层主动探活:
- proxy_socket_keepalive on 启用内核 TCP keepalive,空闲时发探测包;收到 RST 或超时即标记失效并移出池
- keepalive_timeout 设为略小于后端实际超时值(例如后端 90s,Nginx 设 60s),确保在对方断连前主动释放
- proxy_next_upstream error timeout http_502 让首次复用失败时,事件循环立刻切换连接或重试,不阻塞当前请求
内存与结构体复用支撑高频连接流转
高频复用若伴随频繁 malloc/free,性能会迅速被拖垮。Nginx 在内存层彻底规避这个问题:
- 所有连接对象 ngx_connection_t 来自预分配的连接池,worker 启动时一次性分配,运行中只复用不释放
- HTTP 请求上下文、header buffer、body 缓冲区均来自 slab 分配器,头部字段以指针引用原始内存,避免字符串拷贝
- 静态文件响应启用 sendfile on,数据在内核态直接传输,跳过用户空间搬运











