侧边栏壁纸
博主头像
路小飞博主等级

行动起来,活在当下

  • 累计撰写 72 篇文章
  • 累计创建 12 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Nginx 最大 TCP 连接数

路小飞
2026-01-06 / 0 评论 / 0 点赞 / 3 阅读 / 2973 字

本文适配非 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

四、最佳实现

  1. 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 折。

0

评论区