1. 首页 > 技术教程 > 正文

Nginx 调优:连接数、长连接、缓存策略与并发提升

Nginx 调优:连接数、长连接、缓存策略与并发提升

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

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