worker_rlimit_nofile必须与系统limits、systemd配置、内核参数及Nginx events联动调优,设为131072时worker_connections建议90000,并通过/proc/<pid>/limits验证生效。

文件描述符调优不是改一个参数就能解决的事,核心在于让Nginx进程、Linux系统和内核三者的能力对齐。只要其中一层卡在低值,高并发时必然报“Too many open files”,连接直接被拒。
worker_rlimit_nofile 与 worker_connections 必须成比例
worker_connections 是每个 Worker 进程能同时处理的连接数;但每个连接背后还涉及日志句柄、上游代理套接字、临时文件等,实际消耗的文件描述符远不止1个。
- 保守估算:单个 Worker 所需 fd ≈ worker_connections × 2.5
- 若设 worker_connections 为 8192,worker_rlimit_nofile 至少要设到 20000 以上,推荐 65535 或 100000
- 不显式配置 worker_rlimit_nofile,Nginx 就继承启动用户的 ulimit 值(常是 1024),这是线上最常见隐性瓶颈
- 该值若低于 worker_connections,新连接会被静默拒绝,日志里可能只显示 502 或超时
系统级限制必须同步放开,且优先级高于 Nginx 配置
worker_rlimit_nofile 只是“申请额度”,操作系统才是最终审批者。它受两层控制:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 用户级:通过 /etc/security/limits.conf 设置,例如:
nginx soft nofile 100000
nginx hard nofile 100000 - 服务级(systemd):多数现代发行版用 systemd 管理 Nginx,limits.conf 对其默认无效,必须加 /etc/systemd/system/nginx.service.d/override.conf:
LimitNOFILE=100000 - 改完需执行 systemctl daemon-reload && systemctl restart nginx,否则不生效
别忘了内核全局池和 TCP 队列衔接
文件描述符不只是给已建立连接用的,还覆盖 listen 队列里的半连接、TIME_WAIT 状态套接字等。
- fs.file-max 是全系统可分配 fd 总数,应明显高于所有服务需求之和,建议设为 2097152(200 万)以上
- net.core.somaxconn 控制内核 accept 队列长度,默认常为 128,远不够用,需调至 65535,并在 Nginx listen 指令中显式写 backlog=65535
- 启用 net.ipv4.tcp_tw_reuse = 1,允许复用 TIME_WAIT 状态的端口,缓解短连接场景下的 fd 快速耗尽
调优本质是打通“Nginx → 用户态 → 内核态”三层资源通路。漏掉任意一层,再高的 worker_connections 都只是纸面并发。


















