Nginx通过非阻塞I/O实现高并发,核心是设socket为O_NONBLOCK后read()立即返回EAGAIN/EWOULDBLOCK,配合epoll/kqueue事件驱动,仅在就绪时处理,避免阻塞与空轮询,单worker可高效管理数万连接。
Non-blocking IO 是 Nginx 实现高并发能力的底层基石,它不靠增加线程或进程数量,而是让单个 worker 进程高效“盯住”成千上万个连接,真正把 CPU 和内存用在刀刃上。
传统阻塞模式下,调用 read() 时若数据还没到,进程就卡住不动;而非阻塞模式下,只要 socket 被设为 O_NONBLOCK,read() 立即返回——有数据就读走,没数据就报 EAGAIN/EWOULDBLOCK,绝不等待。Nginx 不会反复轮询,而是交给事件驱动机制来决定“什么时候再试”。
每个 worker 进程运行一个独立的事件循环,它不是被动等待,而是主动管理所有连接的状态变化。非阻塞 IO 让这个循环能持续运转,不被个别慢连接拖住节奏。
Nginx 默认已启用非阻塞 IO,但以下几项配置直接影响它能否稳定承载高并发:
如果在 Nginx 中嵌入 Lua 或其他扩展模块,并在里面执行同步 DNS 查询、文件读写或长耗时计算,仍会阻塞整个 worker。这类操作必须改用异步接口(如 Lua cosocket、nginx-http-lua-module 的 ngx.timer.at)才能维持非阻塞特性。