worker_rlimit_nofile受系统级ulimit限制,需先配置/etc/security/limits.conf和systemd的LimitNOFILE,再在nginx.conf main块设该值(建议为hard nofile的90%~99%),并确保worker_connections小于它,最后通过/proc/PID/limits验证生效。

worker_rlimit_nofile 不能突破系统最大文件描述符限制,它只是让 Nginx worker 进程申请更高的软限制——能否成功申请,完全取决于操作系统是否允许。真正起决定作用的是系统级配置,Nginx 配置只是最后一环。
必须先调高系统级限制
系统对每个进程的文件描述符数量有软硬两级限制(ulimit),默认常为 1024/4096,远低于高并发需求。不改这里,Nginx 即使配了 65535 也会静默降级或启动失败。
- 编辑 /etc/security/limits.conf,为 nginx 用户添加两行(假设运行用户是 nginx):
nginx soft nofile 65536nginx hard nofile 65536 - 若使用 systemd(CentOS 7+/Ubuntu 16.04+),还需在 /etc/systemd/system/nginx.service.d/override.conf 中设置:
[Service]LimitNOFILE=65536 - 执行
systemctl daemon-reload && systemctl restart nginx使配置生效
在 nginx.conf 中正确配置 worker_rlimit_nofile
该指令必须放在 main 上下文(即与 user、worker_processes 同级),不能写在 http 或 events 块内。
- 示例配置:
user nginx;worker_processes auto;worker_rlimit_nofile 65535; - 数值建议设为系统 hard nofile 的 90%~99%,比如 hard 是 65536,就设 65535,避免因内核预留导致失败
- 注意:这个值是每个 worker 进程的上限,不是所有进程总和
同步调整 worker_connections 和其他关联参数
worker_connections 表示单个 worker 能处理的最大并发连接数,它必须小于 worker_rlimit_nofile,否则新连接会被拒绝。
- 推荐比例:worker_connections 设为 worker_rlimit_nofile 的 70%~85%
- 例如:
worker_rlimit_nofile 65535;→worker_connections 52428; - 若启用了
open_file_cache或反向代理(upstream),需额外预留句柄给日志、SSL、临时文件等
验证是否真正生效
不能只看配置文件,必须检查运行中 worker 进程的实际限制:
- 查出一个 worker 进程 PID:
ps aux | grep 'nginx: worker' - 执行:
cat /proc/PID/limits | grep "Max open files" - 输出应显示 Soft Limit 和 Hard Limit 均达到你设定的值(如 65535)
- 同时确认内核全局限制足够:
cat /proc/sys/fs/file-max,建议 ≥ 所有服务总需求



















