Nginx如何从5K打到5W并发(4大关键配置)

Nginx是大型架构核心,下面详解Nginx并发性能@mikechen

worker_processes:并发的上限天花板

worker_processes:这是 Nginx 并发处理的基石。

Nginx如何从5K打到5W并发(4大关键配置)

Nginx 采用异步非阻塞模式,理论上一个进程可以处理无数个连接。

但为了减少上下文切换(Context Switch)的损耗,最佳实践是将 Worker 进程数、与服务器的 CPU 物理核心数绑定。

# 自动匹配 CPU 核心数
worker_processes auto;

# 可选:绑定 CPU 亲和性,防止进程在不同核心间跳动(进一步压榨性能)
worker_cpu_affinity auto;

 

worker_connections:每个 Worker 能处理多少连接

如果说 worker_processes 决定了有多少个“工头”,那么 worker_connections 就决定了每个“工头”能同时应付多少个“客户”。

核心逻辑: 默认值通常只有 1024。

这在高并发场景下是极大的浪费,这个值的大小直接决定了 Nginx 的最大并发承载量。

events {
    use epoll; # Linux 必选的高性能 IO 模型
    worker_connections 65535; # 榨干单进程能力
}

Nginx如何从5K打到5W并发(4大关键配置)

必须,同步配合操作系统的文件描述符限制(worker_rlimit_nofile),否则此参数调大也无效。

 

keepalive_timeout:提高并发的关键优化项

开启 Keep-Alive 后,客户端和服务端在传输完数据后不会立即切断 TCP 连接。

后续请求可以复用该连接,这能显著降低 CPU 消耗、并降低延迟。

Nginx如何从5K打到5W并发(4大关键配置)

http {
    keepalive_timeout 65;
    keepalive_requests 10000; # 一个长连接最多跑 1w 个请求
}

太短: 频繁握手,CPU 飙升;

太长: 空闲连接长期占用内存,导致新连接进不来;

建议: 设置为 65s 左右,并配合 keepalive_requests 限制单连接最大请求数。

 

高性能 IO 三件套

这是 Nginx 网络传输效率的核心,它们三者配合,构成了数据传输的“黄金组合”。

Nginx如何从5K打到5W并发(4大关键配置)

① sendfile on; (零拷贝技术)

传统文件传输需要将数据从 磁盘 -> 内核缓冲区 -> 用户缓冲区 -> 内核 Socket 缓冲区 -> 网卡,发生了多次上下文切换和内存拷贝。

开启后: 数据直接从 磁盘 -> 内核缓冲区 -> 网卡。

Nginx 进程不再参与数据搬运,极大降低 CPU 负载。

② tcp_nopush on; (攒够了再发)

作用: 必须在开启 sendfile 时才能使用。

它基于 FreeBSD 的 TCP_CORK 思想(Linux 下对应类似机制)。

逻辑: 它会把 HTTP 响应头和正文中的小包“攒”在一起,等填满一个 TCP 数据包(MSS)后再发送。这减少了网络报文数量,提升了吞吐量。

③ tcp_nodelay on; (别等,立刻发)

作用: 禁用了 Nagle 算法。

逻辑: 乍一看它与 tcp_nopush 矛盾,但在 Nginx 中它们是完美的互补。

sendfile + tcp_nopush 负责高效传输大文件数据。

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧