Linux限制用户最大连接数本质是限制其所有进程的文件描述符总数,需协同配置用户级(/etc/security/limits.conf)、系统级(/proc/sys/fs/file-max)和服务级(systemd的LimitNOFILE)三层。

Linux 中限制系统用户的最大连接数,本质是限制该用户所有进程能打开的文件描述符(file descriptor)总数,因为每个 TCP 连接、socket、打开的文件都占用一个 fd。这不是限制“登录次数”或“SSH 会话数”,而是限制该用户发起/维持的并发网络连接能力。需从三个层级协同配置,缺一不可:
用户级限制:控制单用户进程的 fd 上限
通过 /etc/security/limits.conf 设置软硬限制,仅对 PAM 登录会话生效(如 SSH、console)。
- 编辑文件:
sudo vim /etc/security/limits.conf
- 添加对应用户的规则(不能只靠
*,root 需显式写):www-data soft nofile 65536 www-data hard nofile 65536 # 若服务以 root 运行,也要加: root soft nofile 65536 root hard nofile 65536
- 注意:
soft ≤ hard,否则整行被静默忽略;修改后需重新登录(SSH 断开重连),su -不触发 PAM 重载。
系统级限制:约束全系统 fd 总量
决定整个系统最多能分配多少文件描述符,是所有用户和进程的上限天花板。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 查看当前值:
cat /proc/sys/fs/file-max
- 临时调整(重启失效):
echo 2097152 | sudo tee /proc/sys/fs/file-max
- 永久生效:
echo "fs.file-max = 2097152" | sudo tee /etc/sysctl.d/99-file-limit.conf sudo sysctl --system
- 关键点:用户级
hard nofile不能超过此值,否则ulimit -n会失败。
服务级限制:针对 systemd 托管的服务
Nginx、Redis、Node.js 等通过 systemctl start 启动的服务完全不读 limits.conf,必须单独配置。
- 全局生效(推荐):
sudo systemctl edit --full systemd-system.conf # 在 [Manager] 下添加: DefaultLimitNOFILE=65536
- 单服务生效(更安全):
sudo systemctl edit nginx.service # 加入: [Service] LimitNOFILE=65536
- 修改后必须执行:
sudo systemctl daemon-reload sudo systemctl restart nginx
- 验证:
cat /proc/$(pgrep nginx)/limits | grep "Max open files"
不复杂但容易忽略










