本文适配非 system 管理的 nginx。
一、核心公式
最大连接数 = min(nginx进程模型上限, worker用户系统层硬限制)
关键说明
-
master 进程(通常 root 运行)不处理连接,限制无关;
-
所有连接由 worker 进程处理,其所属用户(如 nobody、nginx)的文件描述符硬限制是核心约束。
二、三步计算法
1. 查 Nginx 核心配置
# nginx -T 2>/dev/null | grep -E "worker_processes|worker_connections|worker_rlimit_nofile"
worker_processes 6; # 工作进程数(与实际 6 个 worker 进程一致)
worker_connections 65536; # 单 worker 最大连接数
worker_rlimit_nofile 1047552; # Nginx 进程文件描述符上限(≤ nobody 硬限制)
进程模型上限计算:
进程模型上限 = worker_processes × worker_connections
2. 查 worker 进程用户及硬限制
# 步骤1:找 worker 所属用户
ps -ef | grep "nginx: worker process" | grep -v grep
# 步骤2:查该用户硬限制(替换【worker用户】)
su - 【worker用户】 -s /bin/bash -c "ulimit -Hn" 或
cat /proc/worker进程的pid/limits |grep "open files"
# 无登录权限时用(替换【worker PID】)
cat /proc/【worker PID】/limits | grep "open files"
3. 算最终连接数
最终上限 = min (进程模型上限,worker 用户硬限制)
-
静态服务:实际≈最终上限 × 90%
-
反向代理:实际≈最终上限 × 50%
三、验证实际连接数
# 统计活跃连接(默认80/443,可加自定义端口)
ss -ant | grep -E ":80|:443" | grep ESTAB | wc -l
# 统计TIME_WAIT 连接数
# TIME_WAIT 不占用 Nginx worker 进程的 “活跃连接数” 名额,但会占用服务器的端口、文件描述符等系统资源
ss -ant | grep -E ":80|:443" | grep TIME_WAIT | wc -l
# 或开启Nginx状态页(推荐)
curl http://127.0.0.1/nginx_status # 需提前配置stub_status
四、最佳实现
-
Nginx 配置层(nginx.conf)
worker_processes auto;
events {
worker_connections 65536; # 每个 worker 最大连接数
use epoll; # Linux 下最优 IO 模型
}
2. 系统用户层(/etc/security/limits.conf)
【worker用户】 soft nofile 400000
【worker用户】 hard nofile 400000
或者
# End of file
* soft nofile 1000000
* hard nofile 1000000
3. 重启生效
nginx -s stop && nginx
五、核心要点
限制核心:worker 进程所属用户的硬限制;
计算关键:进程模型上限与用户硬限制取最小值;
实际修正:静态服务打 9 折,反向代理打 5 折。
评论区