在高并发系统中Nginx是关键,详解我详解Nginx百万并发技术@mikechen
异步非阻塞
传统阻塞模型每连接一个线程,100万并发=100万线程,上下文切换直接崩溃。
Nginx异步非阻塞:单个线程同时处理海量连接,通过事件回调机制避免阻塞。
events {
use epoll; # Linux高性能事件模型
worker_connections 65535; # 单进程最大连接数
multi_accept on; # 批量接受连接
}
Nginx 在 Linux 下使用 epoll 这种 I/O 多路复用技术。
它不再主动轮询每一个连接,而是通过“事件通知”机制。
只有当连接真正产生读写事件时,内核才会通知 Nginx 进行处理。
一个工作进程可以同时监控数万个连接,极大地降低了系统在处理海量空闲连接时的资源损耗。
Nginx架构设计
Nginx 采用了极度稳定的多进程设计,如下图所示:

CPU1: Worker1 → 连接1,3,5,7... CPU2: Worker2 → 连接2,4,6,8... CPU3: Worker3 → 连接9,11,13...
分工明确:
Master 进程:负责接收信号、管理配置、监控 Worker 状态,它不处理具体的网络请求。
Worker 进程:真正处理请求的单元,通常 Worker 数量与服务器 CPU 核心数保持一致。
如果某个 Worker 进程因为复杂逻辑意外崩溃,Master 进程会立即拉起一个新的 Worker,确保服务始终可用。
Worker 进程通过争抢 accept_mutex 锁(或现代内核的 SO_REUSEPORT)来公平分配连接。
由于每个进程处理自己的请求,避免了多线程环境下的锁竞争、和上下文切换。
零拷贝技术
在处理静态资源(如图片、视频、静态 HTML)时,Nginx 利用了操作系统的 sendfile 特性。

传统传输:数据需要经历:磁盘 → 内核缓冲区 → 用户缓冲区(Nginx 内存) → 套接字缓冲区 → 网卡。
这中间发生了多次不必要的内存拷贝。
零拷贝流程:开启 sendfile on; 后,数据直接在内核空间完成传输:磁盘 → 内核缓冲区 → 网卡。
数据无需经过 CPU 中转进入用户空间,大幅降低了 CPU 占用率和内存带宽消耗,使得 Nginx 在发送大文件时几乎能跑满网卡带宽。
缓存架构策略
在百万并发场景中,静态资源与可缓存内容占比通常较高。
将静态文件直接由Nginx提供并开启sendfile、tcp_nopush/tcp_nodelay等内核优化,减少拷贝与系统调用。

http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 连接数统计
keepalive_requests 1000;
keepalive_timeout 60s;
# 缓冲区优化
client_header_buffer_size 4k;
large_client_header_buffers 8 8k;
}
对动态生成但可缓存的响使用缓存策略,并与CDN协同。
把流量推向边缘节点,减轻源站压力,提升全局可用性与访问速度。