6个Nginx配置优化最佳实践(建议收藏)

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 与后端服务器保持一定数量的空闲长连接。

评论交流
    说说你的看法