Nginx 高并发优化方案
下面是一份 真正能落地的《Nginx 高并发优化方案(生产级)》,不是空洞理论,是在高 QPS、海量连接时必须做的调优点。
⭐ 总体目标
让 Nginx 在高并发下:
- 更少上下文切换
- 更少连接阻塞
- 更高吞吐量
- 更低延迟
- 更节省 CPU/内存
以下优化项全部经实战验证。
最佳实践:等于 CPU 核心数
worker_processes auto;
Nginx 每个 worker 单线程 + 事件驱动
- 1 worker 对 1 核心效率最高。
默认 1024 远远不够,并发高时直接爆。
推荐 20k–50k(取决于 fd limit)
worker_rlimit_nofile 200000;
events {
worker_connections 65535;
use epoll;
multi_accept on;
}
原理:
- epoll:最佳事件模型(Linux)
- multi_accept:一次接受多个连接,减少内核 wakeup 数量
修改 /etc/sysctl.conf:
# TIME_WAIT 快速回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0 # 避免 NAT 设备问题
net.ipv4.tcp_fin_timeout = 15
# Backlog 队列更大(默认小)
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 保持长连接性能
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 20
net.ipv4.tcp_keepalive_probes = 3
# 端口复用
net.ipv4.ip_local_port_range = 1024 65535
应用:
sysctl -p
sendfile on;
tcp_nopush on;
tcp_nodelay on;
上游 keepalive
upstream api {
server 10.0.0.1:8000;
server 10.0.0.2:8000;
keepalive 128;
}
客户端 keepalive
keepalive_timeout 65;
keepalive_requests 10000;
适合静态资源、API、反代服务:
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=mycache:200m inactive=7d max_size=20g;
location / {
proxy_cache mycache;
proxy_cache_valid 200 1m;
}
高并发场景缓存是核心——减少后端吞吐 50%–90%。
client_body_buffer_size 128k;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 64k;
proxy_buffering on;
send_timeout 30s;
避免:
- request 头过大(攻击风险)
- 代理阻塞
- worker 卡住
长连接服务:推荐 least_conn
upstream backend {
least_conn;
server 10.0.0.1:8000;
server 10.0.0.2:8000;
}
无状态服务:推荐 round_robin(默认)
有 Session:推荐 ip_hash
listen 443 ssl;
http2 on; # 你特别强调过,已正确配置
好处:
- 一个 TCP 连接多路复用
- 更少的并发连接数
- 更低延迟
对静态网站和前端特别有效。
⸻
- 使用零拷贝 sendfile + gzip 并存优化
Nginx 默认 gzip 会禁用 sendfile
👉 最佳实践:
gzip on; gzip_static on;
gzip_static 直接返回 .gz 文件 -> 避免 CPU 压缩开销。
在高并发时,关闭 access_log 或用缓存写法:
access_log /var/log/nginx/access.log main buffer=512k flush=1s;
甚至禁用
access_log off;
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
location /api/ {
limit_req zone=req_limit burst=20 nodelay;
}
能直接拦截 80% 低成本攻击。
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:20m;
ssl_session_timeout 10m;
ssl_prefer_server_ciphers on;
ssl_session_tickets on;
TLS 会消耗 CPU,session cache / ticket 能降低压力。
最佳架构:
[ Keepalived / VIP ]
|
-----------------
| |
[Nginx #1] [Nginx #2]
| |
-----------------
|
[Backend cluster]
提供:
- VIP 自动漂移
- 前端无感切换
- 后端高可用负载均衡