Nginx高并发能力的底层支柱是非阻塞IO,其核心价值在于缓解CPU、内存和连接资源瓶颈,而非提升单次读写速度;关键在于事件驱动与缓冲策略协同,避免同步耗时操作导致worker阻塞,并需调优系统限制与缓冲区配置。

Non-blocking IO 是 Nginx 高并发能力的底层支柱,它本身不提速单次读写,但能显著缓解 CPU、内存和连接资源类性能瓶颈。关键不在“开启”,而在如何让事件驱动与缓冲策略协同运转。
避免 worker 进程被隐式阻塞
非阻塞 I/O 的优势极易被破坏——只要在请求处理链中出现同步耗时操作,整个 worker 就会卡住。常见隐患包括:
- 使用 Lua 模块时调用阻塞 DNS 解析(如 socket.dns.toip),应改用 resty.http 或 cosocket 异步接口
- 自定义模块中执行未设超时的系统调用(如 fork/wait、阻塞文件锁)
- 启用了第三方模块但未确认其是否适配 event loop,例如某些旧版 auth 模块会同步查数据库
匹配系统限制调优连接承载量
非阻塞模型依赖大量并发连接,但实际承载能力受制于操作系统级限制:
- 检查并提升 open files 上限:
ulimit -n至少设为worker_connections × worker_processes × 2 - 在
/etc/security/limits.conf中为 nginx 用户配置 soft/hard nofile(如 65535) - 确认内核参数
net.core.somaxconn(监听队列长度)和net.ipv4.ip_local_port_range足够支撑瞬时连接爆发
精细控制缓冲区生命周期
缓冲区管理不当会把 Non-blocking 的优势抵消掉:小缓冲反复触发事件,大缓冲又拖慢响应或挤占内存。
- 对 API 接口(头小体小):调小
client_header_buffer_size(如 1k),禁用large_client_header_buffers - 对文件上传场景:增大
client_body_buffer_size(如 8m),同时设置client_body_temp_path指向高速磁盘,避免内存溢出 - 静态资源服务务必启用
sendfile on,让内核直接 DMA 传输,跳过用户态拷贝
让事件机制真正高效运转
epoll/kqueue 只有在正确使用模式下才能发挥最大价值:
- Nginx 1.15.10+ 默认启用 epoll ET(边缘触发)模式,无需额外配置,但需确保所有 I/O 操作都一次性处理完就绪数据
- 避免在
location块中滥用if判断或复杂正则,它们会在每次匹配时增加事件循环开销 - 关闭不必要的日志写入(
access_log off)或启用缓冲(buffer=16k),减少磁盘 I/O 对事件调度的干扰



















