Nginx 高并发能力源于非阻塞 I/O、事件驱动、模块解耦、超时控制与进程隔离:每个 worker 用非阻塞 socket 处理连接,事件循环派发任务,各阶段注册回调,超时机制明确约束行为,Master-Worker 架构保障容错。

它靠的不是“加快单个连接”,而是让成千上万连接共存时,没有一个能拖垮整体——关键在不阻塞、可隔离、有边界。
非阻塞 I/O 是底线,避免任何环节卡死主线程
每个 worker 进程用非阻塞 socket 处理所有操作:accept、recv、send 全部立即返回。遇到 EAGAIN 就暂停,注册对应事件,转头处理其他就绪连接。比如客户端上传极慢,只要配置了 client_body_timeout,超时后连接干净关闭,内存释放,不占 worker 线程。
- 所有读写操作限定在用户态内存中完成,不调用可能阻塞的系统函数(如阻塞式 read/write)
- send() 只发当前内核缓冲区允许的字节数,剩余数据挂起并监听 EPOLLOUT,等可写再续
- 启用 sendfile on 处理静态文件,数据直接内核零拷贝到 socket,跳过用户空间搬运
事件循环与模块解耦,故障不扩散
核心事件循环只负责派发“哪个连接有事发生”,HTTP 解析、缓存判断、上游转发等全由独立模块的回调函数执行。一个模块出问题(比如某段 Lua 脚本卡住),不会让整个事件循环停摆;你也可以临时禁用 auth_request 或换用 JWT 校验,不影响底层调度。
- 每个请求按阶段拆解(读头、解析 URI、匹配 location、调用 upstream),各阶段注册独立回调
- 头部解析在内存快速完成,不涉及磁盘或网络等待
- 动态请求转发时复用 keepalive 连接,避免重复握手和慢启动
超时与资源控制是安全阀,把不确定变成确定
异步本身不等于稳定,失控的等待才是隐患。Nginx 提供多层超时机制,把模糊延迟转化为明确行为:
- client_header_timeout / client_body_timeout 防慢速客户端长期占连接
- proxy_connect_timeout / proxy_send_timeout / proxy_read_timeout 明确约束与后端交互边界
- keepalive_timeout 和 keepalive_requests 控制空闲连接生命周期,防堆积耗尽资源
- client_max_body_size 和 client_body_buffer_size 控制 POST 处理方式:小请求走内存,大请求才落盘,避免突发上传打爆内存
系统协同与进程隔离,兜住底层风险
再好的模型也依赖底层支持。Linux 下显式配置 use epoll;,确保 worker_connections 不超过 ulimit -n;worker_processes 设为 CPU 核心数,并配合 worker_cpu_affinity auto 减少上下文切换。更重要的是 Master-Worker 架构带来的天然容错:某个 worker 因正则回溯、OOM 或模块 bug 崩溃,Master 会毫秒级拉起新进程,其余 worker 继续服务,用户几乎无感知。
- 日志开启缓冲:access_log path buffer=64k flush=5s,避免磁盘抖动拖慢主线程
- SSL 握手启用 ssl_session_cache shared:SSL:10m,减少加解密重复开销
- 避免在 Lua 中使用同步 http.request,改用 cosocket 或移至后端处理



















