Nginx 调优:连接数、长连接、缓存策略与并发提升
如果你的 Nginx 服务器在流量高峰时频繁报 502 或 504,或者 CPU 飙升、响应变慢,说明默认配置已经撑不住了。主机选的 Linux 教程里,这篇专门讲 Nginx 调优,直接给实战参数,改完就能扛住更大并发。

连接数调优:从 worker_processes 到 worker_connections
Nginx 的并发能力取决于 worker 进程数和每个进程能处理的连接数。默认配置往往偏保守,不改的话,稍微来点流量就崩。
调整 worker_processes 与 worker_connections
先看 CPU 核心数,然后按比例设置。别问为什么,照着做就行。
查看 CPU 核心数
grep -c processor /proc/cpuinfo
假设输出 4,说明有 4 核
然后在 `nginx.conf` 的 `events` 块里修改:
nginx
events {
worker_connections 10240; # 每个 worker 最大连接数,根据内存调整
multi_accept on; # 一次接受所有新连接,减少惊群
use epoll; # Linux 下高性能事件模型
}
`worker_processes` 建议设为 CPU 核心数或 2 倍。比如 4 核就写 `worker_processes 4`。
调优后检查配置
改完配置一定要测试语法,不然重启直接挂掉:
nginx -t # 检查语法
nginx -s reload # 平滑重载
万一报错了别慌,看错误日志 `/var/log/nginx/error.log`,常见问题是 `worker_connections` 设太大导致内存不足,调小 20% 再试。
长连接配置:减少握手开销
HTTP 短连接每次请求都要三次握手,高并发下浪费大量资源。开启长连接后,客户端可以复用连接,吞吐量直接翻倍。
设置 keepalive 参数
在 `http` 块里配置以下参数:
nginx
http {
keepalive_timeout 65; # 长连接超时秒数,超时后自动断开
keepalive_requests 1000; # 单个连接最大请求数,防止连接无限占用
send_timeout 10; # 发送超时,避免慢客户端拖垮服务器
}
`keepalive_timeout` 不建议超过 120 秒,否则会积压大量空闲连接,浪费文件描述符。`keepalive_requests` 设 1000 是中等水平,如果站点图片多,可以调到 5000。
配合 upstream 的长连接
如果 Nginx 做反向代理,后端也要开启长连接,否则前端白配:
nginx
upstream backend {
server 127.0.0.1:8080;
keepalive 32; # 与后端保持的空闲连接数
}
缓存策略:静态资源与代理缓存
Nginx 的缓存能力经常被低估。合理配置后,静态资源直接从内存返回,后端压力骤降。
静态资源浏览器缓存
对 CSS、JS、图片等设置过期时间,减少重复请求:
nginx
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d; # 缓存 30 天
add_header Cache-Control "public, immutable";
}
注意 `immutable` 参数,告诉浏览器文件不会变,直接走本地缓存,连协商请求都省了。
代理缓存(proxy_cache)
如果 Nginx 反代后端 API,可以启用代理缓存,减少对应用服务器的冲击:
nginx
http {
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m max_size=1g;
server {
location /api/ {
proxy_cache mycache;
proxy_cache_valid 200 302 60m; # 成功响应缓存 60 分钟
proxy_cache_valid 404 1m; # 404 缓存 1 分钟
proxy_pass http://backend;
}
}
}
缓存路径要提前创建并赋予 Nginx 用户权限:
mkdir -p /var/cache/nginx
chown -R nginx:nginx /var/cache/nginx
并发提升:系统层面与内核参数
Nginx 调优不止改配置文件,系统限制也要放开。最常见的是文件描述符上限和端口范围。
修改系统文件描述符限制
临时生效
ulimit -n 65535
永久修改,编辑 /etc/security/limits.conf
添加以下两行
* soft nofile 65535
* hard nofile 65535
优化内核参数
在 `/etc/sysctl.conf` 追加:
net.core.somaxconn = 65535 # 最大 listen 队列长度
net.ipv4.tcp_max_syn_backlog = 65535 # SYN 队列长度
net.ipv4.tcp_tw_reuse = 1 # 复用 TIME_WAIT 连接
然后执行 `sysctl -p` 生效。
老鸟叮嘱
千万别在生产环境直接改大 `worker_connections` 而不测试内存。每个连接大约占用 2-4KB 内存,如果 `worker_connections` 设为 65535,4 个 worker 就需要 1GB 以上内存。物理机内存不足时,系统会 OOM 杀掉 Nginx 进程。
建议先用 `strace -p <nginx_pid>` 观察系统调用,确认瓶颈在连接数还是 I/O,再针对性调整。
FAQ
Q:Nginx 连接数上不去,提示“too many open files”怎么办?
A:先执行 `ulimit -n` 查看当前限制。如果小于 1024,按上文修改 `/etc/security/limits.conf`,然后重启 Nginx 服务。
Q:开启了长连接,但浏览器还是频繁新建连接是什么原因?
A:检查 `keepalive_timeout` 是否设得太短,或者浏览器端限制了长连接。Chrome 默认每个域名最多 6 个长连接,可以配合 HTTP/2 解决。
Q:Nginx 代理缓存后,用户看到旧数据怎么办?
A:在 `location` 块里添加 `proxy_cache_bypass $http_cache_control`,或者手动清理缓存:`rm -rf /var/cache/nginx/*`。
Q:Linux 小白可以直接用 root 账号操作 Nginx 调优吗?
A:不建议。尽量用普通用户加 sudo 执行,避免误操作导致系统崩溃。Nginx 本身也不建议以 root 运行。
Q:BBR 开启后为什么速度没有明显提升?
A:BBR 主要优化 TCP 拥塞控制,对 Nginx 连接数提升没有直接关系。如果并发瓶颈在文件描述符或 worker 数,先调优本文提到的参数。
Q:Nginx 调优后 CPU 还是 100% 怎么办?
A:用 `top` 看是 Nginx 进程占满还是 PHP-FPM/后端占满。如果是 Nginx,检查 `worker_processes` 是否超过 CPU 核心数过多;如果是后端,考虑加缓存或升级硬件。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9534.html 商家投稿邮箱:zhujixuanblog@qq.com
