一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Nginx 如何在 Nginx 中配置最大文件描述符限制支持海量并发连接访问

时间:2026-08-15 12:41:48 编辑:袖梨 来源:一聚教程网

要让Nginx真正撑住海量并发,必须同步打通系统、用户、Nginx三层文件描述符限制:systemd优先级最高(如LimitNOFILE=1048576),其次nginx.conf中worker_rlimit_nofile,再配limits.conf;HTTPS下每个连接耗3–5个FD,worker_rlimit_nofile应按worker_connections×4设并留余量,最后验证proc/pid/limits是否生效。

要让 Nginx 真正撑住海量并发(比如数万甚至十万级连接),光改 worker_connections 不够,必须让“最大文件描述符限制”在系统、用户、Nginx 三层全部打通——任何一层卡住,都会触发 accept() failed (24: Too many open files) 错误。

确认当前哪一层实际生效了

别猜,直接查:

  1. 运行 ulimit -n,看当前 shell 的 soft nofile 值(影响 Nginx 启动环境)
  2. 执行 cat /proc/$(cat /var/run/nginx.pid)/limits | grep "Max open files",这是 Nginx worker 进程真正拿到的上限(最关键的判断依据)
  3. 运行 sysctl fs.file-max,确认系统总容量是否足够(建议 ≥ worker_processes × worker_connections × 1.5

同步放开三类限制(缺一不可)

优先级从高到低:systemd > nginx.conf > limits.conf

  1. systemd 服务级(最高优先级):编辑 /etc/systemd/system/nginx.service.d/override.conf,加入:

    [Service]

    LimitNOFILE=1048576

    然后执行 systemctl daemon-reload && systemctl restart nginx

  2. Nginx 主配置声明:在 nginx.conf 的全局块(main context)中添加:

    worker_rlimit_nofile 1048576;

    注意:该值不能超过 systemd 或 limits.conf 中设置的 hard nofile,否则启动失败

  3. 用户级持久限制:在 /etc/security/limits.conf 中为 nginx 用户(或通配 *)设置:

    * soft nofile 1048576

    * hard nofile 1048576

    如果用 root 启动再降权,root 的限制也得达标

匹配真实连接压力来设值

HTTPS 场景下每个连接实际占用 3–5 个文件描述符,HTTP 约 1–2 个。不要只按 worker_connections 设:

  1. worker_connections 65535,且启用 HTTPS,worker_rlimit_nofile 至少设为 262140(65535 × 4),推荐直接设 1048576 留足余量
  2. 同时检查 worker_processes auto;worker_cpu_affinity auto; 是否启用,避免连接堆积在少数 worker 上
  3. 配合内核参数:fs.file-max = 2097152net.core.somaxconn = 65535,写入 /etc/sysctl.confsysctl -p 生效

验证是否真正生效

重启后务必验证:

  1. 再次运行 cat /proc/$(cat /var/run/nginx.pid)/limits | grep "Max open files",确保 soft/hard 均显示你设定的数值(如 1048576)
  2. abwrk 发起高并发压测,观察 error log 是否还有 Too many open files
  3. 监控 ss -slsof -p $(cat /var/run/nginx.pid) | wc -l,对比活跃连接与 FD 使用量

热门栏目