必须先配置系统级硬限制(如limits.conf或systemd LimitNOFILE),再在nginx.conf main块设worker_rlimit_nofile(≤hard nofile),最后通过/proc/PID/limits验证软硬限一致生效。

直接设 worker_rlimit_nofile 不会生效——它只是 Nginx 的“申请指令”,真正起作用的是系统对 nginx 用户的硬限制。必须从系统层开始配,再落到 Nginx 配置,最后验证运行时值。
先确认并提升系统级限制
nginx 用户能设多大的 worker_rlimit_nofile,取决于它的 hard nofile 限制:
- 查当前值:
sudo -u nginx bash -c "ulimit -Hn"(若报错或返回 1024,说明太低) - 改
/etc/security/limits.conf,加两行(以用户nginx为例):
nginx soft nofile 131072
nginx hard nofile 131072 - 确保 PAM 加载 limits:检查
/etc/pam.d/common-session是否含session required pam_limits.so - 若用 systemd 启动,还需在
/etc/systemd/system/nginx.service.d/override.conf中写:
[Service]
LimitNOFILE=131072
然后执行systemctl daemon-reload && systemctl restart nginx
再配置 nginx.conf 主块
该指令必须放在全局最外层,和 user、worker_processes 同级,不能嵌套在 http 或 events 块里:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 示例配置:
user nginx;
worker_processes auto;
worker_rlimit_nofile 131072; - 数值建议设为系统 hard nofile 的 90% 左右(如 hard 是 131072,这里设 118000),留余量给日志、SSL 缓存、临时文件等
- 配套调整
events { worker_connections 65535; },建议不超过worker_rlimit_nofile的 70%~85%
最后验证是否真生效
重启 Nginx 后,不能只看配置是否加载成功,要查进程实际限制:
- 找一个 worker 进程 PID:
pgrep -f "nginx: worker" - 查它的运行时限制:
cat /proc/<PID>/limits | grep "Max open files"
输出应类似:
Max open files 118000 118000 files
软硬限都得是你设的数,否则就是某一层没配对 - 压测时观察 error.log 是否还有
open() failed (24: Too many open files) - 用
lsof -p <PID> | wc -l看当前 fd 占用,长期超 85% 就需扩容或排查泄漏
整个链路是:系统 hard nofile → nginx 用户权限 → worker_rlimit_nofile 申请 → worker 进程实际限制。断掉任何一环,都会卡在 1024 或报 Permission denied。

















