Nginx高并发吞吐瓶颈常因文件描述符三层限制未对齐所致,需同步调整系统file-max、systemd服务LimitNOFILE、用户limits.conf及nginx.conf中worker_rlimit_nofile和worker_connections,并预留FD余量。

确认当前 FD 硬限制在哪一级生效
别猜,直接查真实值:
- 系统全局上限:cat /proc/sys/fs/file-max,建议 ≥ 2000000(尤其百万级连接场景)
- 当前用户限制:ulimit -n,若仍是 1024,说明基础未铺平
- Nginx worker 进程实际值:cat /proc/$(pgrep nginx | head -1)/limits | grep "Max open files",这才是真正起效的数字
同步放开 systemd 服务与用户级硬限制
现代 Linux 多数用 systemd 启动 Nginx,/etc/security/limits.conf 单独设置会被忽略,必须双管齐下:
- 为 Nginx 服务单独设限:sudo systemctl edit nginx,写入:
[Service]
LimitNOFILE=65535 - 补全用户级限制(保障手动启停、调试时不失效):
在 /etc/security/limits.conf 中添加:
nginx soft nofile 65535
nginx hard nofile 65535 - 重载并重启:sudo systemctl daemon-reload && sudo systemctl restart nginx
在 nginx.conf 中显式声明硬限制上限
即使系统给了 65535,Nginx 默认也不会用满。必须在全局块中写明:
- worker_rlimit_nofile 65535; —— 告诉每个 worker 进程最多能打开多少 FD
- events 块中:worker_connections 50000; —— 建议设为硬限制的 70%~80%,为日志、SSL 握手、upstream 连接等预留空间
- HTTPS 场景注意:单个连接实际占用 3~5 个 FD,worker_connections 要更保守,比如目标并发 2 万,建议设 3.5 万以内
防止 FD 被空闲连接长期占满
反向代理常见问题是长连接堆积,尤其后端响应慢时,TIME-WAIT 和 keepalive 连接持续不释放:
- 调低客户端 keepalive_timeout:keepalive_timeout 20;(HTTP/1.1)或配合 http2_max_requests 1000;(HTTP/2)
- 上游连接节制:proxy_http_version 1.1; + proxy_set_header Connection ''; + proxy_socket_keepalive on;
- 观察回收是否及时:ss -s | grep 'timewait',若持续高于 1 万,说明连接复用或超时策略需收紧


















