nginx无损转发依赖多进程+事件驱动+系统协同:worker数与物理核心精准对齐,单worker通过epoll复用数万连接,配合use epoll、multi_accept、worker_connections等参数及内核调优,实现高并发下不丢连、不超时、低延迟。

nginx 多进程模型本身不直接“转发”,真正承担无损转发任务的是每个 worker 进程内部的异步非阻塞事件循环。所谓“无损”,核心是指在高并发下不丢连接、不超时、不堆积请求,同时保持低延迟和高吞吐。这靠的是多进程 + 事件驱动 + 系统协同三者咬合运转,而不是单纯堆 worker 数量。
worker 进程数与 CPU 资源精准对齐
每个 worker 是单线程、独占一个 CPU 核心运行的。配置 worker_processes auto; 或显式设为物理核心数(不含超线程),可避免跨核调度和缓存失效。配合 worker_cpu_affinity auto;,让 OS 自动绑定进程到对应核心,减少上下文切换开销。过多 worker 会争抢 CPU,过少则无法吃满带宽——这不是越多越好,而是“刚刚好”。
单个 worker 高效复用连接与时间片
一个 worker 不是“一个连接一个循环”,而是通过 epoll 监听成千上万个 socket 的读写就绪事件。当处理请求遇到阻塞点(如等待 upstream 响应),它立刻注册回调并让出控制权,转去处理其他就绪事件。这意味着: • 同一 worker 可同时管理数万并发连接; • 连接生命周期中 90% 时间花在网络传输,worker 在此期间不空转、不阻塞; • 新连接进来时,只要 epoll 就绪队列有空位,就能被立即 accept,不会排队等待。
关键参数保障转发链路稳定
无损转发依赖几个硬性配置协同生效:
• use epoll;:Linux 下必须启用,支持百万级 fd,事件通知而非轮询;
• multi_accept on;:一次事件循环尽可能多地 accept 就绪连接,降低唤醒频率;
• worker_connections 65535;:结合系统 ulimit -n 和 net.core.somaxconn 一起调大,防止连接被内核丢弃;
• proxy_buffering on; 且合理设置 proxy_buffers 和 proxy_busy_buffers_size,避免因缓冲区不足导致 upstream 响应被截断或重发;
• sendfile on; + tcp_nopush on;:静态资源零拷贝发送,减少内核/用户态切换和小包发送。
系统层兜底防止连接断裂
nginx 再优,也依赖内核支撑。若不调系统参数,上游连接激增时极易出现 TIME-WAIT 占满端口、listen queue 溢出丢 SYN 包等问题:
• net.core.somaxconn = 65535:扩大全连接队列,应对突发建连;
• net.ipv4.tcp_tw_reuse = 1:允许 TIME-WAIT 套接字快速复用于 outbound 连接(需 net.ipv4.tcp_timestamps = 1);
• fs.file-max 和 ulimit -n 至少设为 100 万,匹配 nginx 的连接上限;
• net.ipv4.ip_local_port_range 扩至 1024 65535,增加可用临时端口数量。
不复杂但容易忽略











