应配置 worker_rlimit_nofile 指令并同步提升系统级限制;在 nginx.conf main 块设 worker_rlimit_nofile 65536,同时在 /etc/security/limits.conf 中为 nginx 用户配置软硬 nofile 限值,并在 systemd 环境下补充 limitnofile=65536。

要解决 Nginx 报错 "socket() failed (24: Too many open files)",核心是提升进程能打开的文件描述符上限,而 worker_rlimit_nofile 正是 Nginx 主配置中专门用于设置工作进程最大打开文件数的指令。
理解 worker_rlimit_nofile 的作用
该指令在 main 块(即全局上下文)中设置,它会通过 setrlimit(RLIMIT_NOFILE, ...) 系统调用,为每个 worker 进程单独设定软限制(soft limit)。注意:它不会自动提升系统级硬限制(hard limit),若指定值超过当前 hard limit,Nginx 启动时会报错或静默降级——因此必须确保系统允许该值。
正确配置 worker_rlimit_nofile 的步骤
-
检查当前系统限制:运行
ulimit -n(查看当前 shell 限制)、cat /proc/sys/fs/file-max(系统级总上限)、cat /proc/$(pidof nginx)/limits | grep "Max open files"(已运行 Nginx 进程实际生效值) -
提升系统级 hard limit:编辑
/etc/security/limits.conf,添加两行:nginx soft nofile 65536nginx hard nofile 65536
(假设 Nginx 以用户nginx运行;如用www-data或root,需对应修改) -
在 nginx.conf 中设置:在
main块(位于 events 块之前)加入:worker_rlimit_nofile 65536;
注意不要放在 http、server 或 location 块内,否则语法错误 -
重启并验证:执行
nginx -t && systemctl reload nginx,再查进程 limits 确认数值已更新
常见误区与补充要点
-
它不替代系统配置:仅写
worker_rlimit_nofile而不调高系统 limits,Nginx 可能无法真正应用该值,尤其在 systemd 环境下还需额外配置LimitNOFILE=65536到/etc/systemd/system/nginx.service.d/override.conf - 不是连接并发数的直接等价物:一个 HTTP 连接通常占用至少 2 个 fd(监听 socket + 客户端 socket),HTTPS 更多;还需预留日志文件、临时文件等。建议设为预期峰值连接数的 2–3 倍
-
避免设得过高但无意义:如设为 100 万,而
/proc/sys/fs/file-max仅 10 万,则内核会拒绝;应保持worker_rlimit_nofile × worker_processes ≤ fs.file-max × 0.8左右留有余量
快速验证是否生效
启动后运行:grep "Max open files" /proc/$(pgrep -f "nginx: worker")/limits
输出中应看到类似 Max open files 65536 65536 files(软硬限制一致),说明配置已成功加载。










