Nginx通过事件驱动+非阻塞I/O(如epoll)实现高并发,单worker可调度数万连接,避免线程阻塞与上下文切换;配置worker_connections、超时参数等可优化抗慢连接能力。

Non-blocking IO 是 Nginx 实现高并发、低延迟的核心机制,它本身不提升单次读写速度,但显著优化整体处理效率——关键在于让单个 worker 进程能同时调度数万连接,避免资源空转和线程阻塞。
非阻塞 I/O 如何释放 CPU 资源
传统阻塞模式下,每个连接需独占一个线程等待数据就绪;而 Nginx 在 socket 上设置 O_NONBLOCK 标志后,recv() 或 send() 调用立即返回:
- 有数据就处理,没数据就返回
EAGAIN/EWOULDBLOCK,不挂起进程 - CPU 立即转向其他就绪事件,无需轮询或切换上下文
- 配合 epoll/kqueue 的事件通知机制,只在“可读”“可写”时才触发操作
事件驱动模型放大非阻塞优势
非阻塞 I/O 必须与事件循环协同才能发挥价值。Nginx 每个 worker 进程内置一个事件循环:
- Linux 默认使用 epoll(支持边缘触发 ET 模式),减少重复事件通知
- 新连接建立、数据到达、缓冲区可写等均由内核主动通知
- 一次 TCP 包可能分片到达,Nginx 会持续监听该连接的可读事件,分多次收完,全程不阻塞
实际效率提升体现在三方面
衡量 Non-blocking IO 的效果,重点不是“读得多快”,而是系统级吞吐与稳定性:
- 零线程切换开销:无需为每个连接创建线程,节省栈空间与调度时间
-
内存更轻量:每个连接仅维护一个
ngx_connection_t结构体,而非完整线程上下文 - 抗慢客户端能力:某客户端上传缓慢时,其连接仅占用事件槽位,不影响其他请求调度
配置上如何支撑 Non-blocking 高效运行
该机制默认启用,但需合理配置才能释放全部潜力:
-
worker_processes auto;—— 充分利用多核 CPU -
worker_connections 10240;—— 匹配系统ulimit -n限制 - 确保
client_header_timeout和client_body_timeout设置合理,避免无效连接长期滞留事件队列 - 避免在 Lua 或第三方模块中执行同步阻塞操作(如未用 cosocket 的 DNS 查询),否则会拖垮整个 worker


















