Linux限制用户最大连接数本质是限制其文件描述符总数,因每个TCP连接占用一个fd;需配置limits.conf设soft/hard nofile、启用pam_limits.so、为systemd服务单独设LimitNOFILE,并调大fs.file-max等内核参数协同优化。

Linux 中限制系统用户的最大连接数量,本质是限制该用户所有进程能打开的文件描述符(file descriptor)总数,因为每个 TCP 连接都会占用一个 fd。这不是靠“禁止登录”或“限制 SSH 会话数”实现的,而是通过操作系统资源配额机制统一管控。
修改用户级文件描述符限制(核心步骤)
这是最直接、最常用的方式,适用于交互式登录用户和其启动的全部服务进程:
- 编辑 /etc/security/limits.conf,添加两行(以用户 www-data 为例):
www-data soft nofile 65536<br>www-data hard nofile 65536
若想对所有普通用户生效,可用* soft nofile 65536,但注意*不匹配root,root 需单独写 - 确保 PAM 模块已启用:检查 /etc/pam.d/common-session 是否含
session required pam_limits.so(Ubuntu/Debian 默认有;CentOS 需确认 /etc/pam.d/system-auth) - 用户需重新登录(SSH 重连)才生效;
su -不触发 limits 加载
适配 systemd 服务(关键补充)
现代 Linux 发行版中,用 systemctl start 启动的服务(如 nginx、redis、node.js 应用)完全不读 limits.conf,必须显式配置:
- 单服务设置(推荐):
sudo systemctl edit nginx.service,加入:[Service]<br>LimitNOFILE=65536
- 全局设置(谨慎):
sudo systemctl edit --full systemd-system.conf,添加:DefaultLimitNOFILE=65536 - 改完必须执行:
sudo systemctl daemon-reload && sudo systemctl restart nginx
验证是否真正生效
不能只看 ulimit -n,要分层确认:
- 当前 shell 会话:
ulimit -n(应显示 65536) - 目标服务进程:
cat /proc/$(pgrep -f "nginx: master")/limits | grep "Max open files"(查看Soft Limit和Hard Limit) - 系统总上限(兜底):
cat /proc/sys/fs/file-max,必须 ≥ 单用户限制 × 预估并发用户数,否则会被内核拒绝
关联内核参数(防止瓶颈转移)
仅调用户限制还不够,还需同步优化底层支撑:
- 增大系统总句柄数:
在 /etc/sysctl.conf 加:fs.file-max = 2097152,然后sudo sysctl -p - 放宽本地端口范围(影响客户端连接能力):
net.ipv4.ip_local_port_range = 1024 65535(避免客户端因端口耗尽无法建连) - 提升监听队列深度(防 SYN 包丢弃):
net.core.somaxconn = 65535


















