Nginx 在高并发场景下,并发优化非常重要,下面我详解Nginx配置优化@mikechen
1. 优化 Worker 进程数
Nginx 采用 Master-Worker 多进程模型,worker_processes 决定 Worker 进程数量。
worker_processes auto;
推荐直接使用:
worker_processes auto;
Nginx 会根据 CPU 核数自动设置 Worker 数量。
例如:
8核CPU
↓
worker_processes auto
↓
8个Worker进程
对于高并发服务器,可以避免手工配置不合理导致 CPU 资源浪费。
2. 优化 Worker 连接数
核心参数:
events {
worker_connections 65535;
}
worker_connections 表示单个 Worker 最大连接数。
假设:
worker_processes = 8
worker_connections = 65535
理论连接能力约为:
8 × 65535 ≈ 52万连接
但要注意,这只是理论值,实际还受到:
- 文件描述符
- 内存
- CPU
- 网络带宽
- 上游服务能力
等因素限制。
因此还需要配合:
worker_rlimit_nofile 65535;
完整配置:
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 65535;
}
3. 开启高效事件模型
Linux 环境建议使用 epoll:
events {
use epoll;
worker_connections 65535;
}
epoll 是 Linux 下高并发网络编程的重要机制。
传统模型:
连接1
连接2
连接3
...
连接N
↓
遍历大量连接
而 epoll:
大量连接
↓
epoll事件监听
↓
只处理活跃连接
↓
业务处理
在大量并发连接场景下,可以显著降低无效遍历带来的 CPU 开销。
Linux 生产环境通常可以直接使用
use epoll,或者交给 Nginx 自动选择。
4. 开启 TCP 连接复用
① 开启 sendfile
sendfile on;
传统文件传输:
磁盘
↓
用户态
↓
内核态
↓
用户态
↓
网卡
开启 sendfile 后,可以减少用户态与内核态之间的数据拷贝。
磁盘
↓
内核
↓
网卡
对于静态文件、图片、视频等场景尤其有价值。
② 开启 TCP_NOPUSH
tcp_nopush on;
通常与 sendfile 配合:
sendfile on;
tcp_nopush on;
可以减少网络数据包数量,提高大文件传输效率。
③ 开启 TCP_NODELAY
tcp_nodelay on;
主要用于减少 TCP 小包传输的延迟。
因此常见生产配置:
sendfile on;
tcp_nopush on;
tcp_nodelay on;
5. 开启 HTTP Keepalive
高并发场景下,不建议每个 HTTP 请求都重新建立 TCP 连接。
开启:
keepalive_timeout 65;
例如:
第一次请求
客户端 ─── TCP连接 ───> Nginx
第二次请求
客户端 ─── 复用连接 ──> Nginx
第三次请求
客户端 ─── 复用连接 ──> Nginx
而不是:
请求1 → 建立TCP → 请求 → 关闭
请求2 → 建立TCP → 请求 → 关闭
请求3 → 建立TCP → 请求 → 关闭
可以进一步配置:
keepalive_timeout 65;
keepalive_requests 1000;
这样可以减少:
- TCP三次握手
- TCP连接关闭
- 系统调用
- CPU消耗
特别适合 API、微服务、HTTP 长连接等场景。
6. 优化反向代理连接池
如果 Nginx 作为网关/反向代理,建议重点优化 upstream。
例如:
upstream backend {
server 10.0.0.1:8080;
server 10.0.0.2:8080;
keepalive 128;
}
然后:
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://backend;
}
这里的关键是:
keepalive 128;
它允许 Nginx 与后端服务器保持一定数量的空闲长连接。