Nginx如何扛住百万并发(4大关键技术)

在高并发系统中Nginx是关键,详解我详解Nginx百万并发技术@mikechen

异步非阻塞

传统阻塞模型每连接一个线程,100万并发=100万线程,上下文切换直接崩溃。

Nginx异步非阻塞:单个线程同时处理海量连接,通过事件回调机制避免阻塞。

events {
    use epoll;           # Linux高性能事件模型
    worker_connections 65535;  # 单进程最大连接数
    multi_accept on;     # 批量接受连接
}

Nginx 在 Linux 下使用 epoll 这种 I/O 多路复用技术。

它不再主动轮询每一个连接,而是通过“事件通知”机制。

只有当连接真正产生读写事件时,内核才会通知 Nginx 进行处理。

一个工作进程可以同时监控数万个连接,极大地降低了系统在处理海量空闲连接时的资源损耗。

 

Nginx架构设计

Nginx 采用了极度稳定的多进程设计,如下图所示:

Nginx如何扛住百万并发(4大关键技术)-mikechen

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如何扛住百万并发(4大关键技术)-mikechen

传统传输:数据需要经历:磁盘 → 内核缓冲区 → 用户缓冲区(Nginx 内存) → 套接字缓冲区 → 网卡。

这中间发生了多次不必要的内存拷贝。

零拷贝流程:开启 sendfile on; 后,数据直接在内核空间完成传输:磁盘 → 内核缓冲区 → 网卡。

数据无需经过 CPU 中转进入用户空间,大幅降低了 CPU 占用率和内存带宽消耗,使得 Nginx 在发送大文件时几乎能跑满网卡带宽。

 

缓存架构策略

在百万并发场景中,静态资源与可缓存内容占比通常较高。

将静态文件直接由Nginx提供并开启sendfile、tcp_nopush/tcp_nodelay等内核优化,减少拷贝与系统调用。

Nginx如何扛住百万并发(4大关键技术)-mikechen

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协同。

把流量推向边缘节点,减轻源站压力,提升全局可用性与访问速度。

评论交流
    说说你的看法