Nginx处理高频连接的核心是非阻塞I/O与事件驱动机制协同:socket设为O_NONBLOCK,依赖epoll/kqueue只响应就绪事件,通过可中断的连接生命周期管理和系统级调优实现单worker万级并发。
Nginx 处理高频网络连接的核心,不是靠“硬扛”,而是靠非阻塞 I/O 与事件驱动机制的紧密配合——它让单个 worker 进程能同时盯住数万连接,每个连接只在真正有事(可读、可写、超时、断开)时才被处理,其余时间不占 CPU、不抢资源、不卡队列。
所有客户端连接的 socket 都被设为 O_NONBLOCK 模式。这意味着:
recv() 时,哪怕只收到 1 字节,也立刻返回;没数据就直接报 EAGAIN,绝不等待send() 同样不等:缓冲区满就返回 EAGAIN,而不是卡在那里等 TCP 窗口腾出空间高频建连/断连不是靠“快速关”来解决的,而是靠把整个连接拆成可中断、可挂起、可复用的阶段:
非阻塞本身不能替代合理约束,否则连接会“堆而不死”,最终耗尽 fd 或卡住 worker:
keepalive_timeout 0,响应完立即断连,空闲连接不占槽位reset_timedout_connection on,对握手失败、读写超时直接发 RST,不等内核回收client_header_timeout 5s、client_body_timeout 10s、send_timeout 15s,防慢速攻击或弱网拖累worker_rlimit_nofile 1048576 + ulimit -n 调高,确保 epoll 能管够多 fd光靠 Nginx 配置不够,还需和内核及硬件配合:
multi_accept on 和 accept_mutex off(确认内核 ≥ 3.9),让单次 epoll_wait 批量 accept,减少锁争抢net.core.somaxconn 和 net.ipv4.tcp_tw_reuse,避免 SYN 丢包和 TIME_WAIT 端口耗尽sendfile on,绕过用户态拷贝;大文件上传启用 aio threads,避免阻塞读盘