服务器句柄数限制需分用户、系统、服务三层配置,仅改一处无效:/etc/security/limits.conf仅对pam登录用户生效;systemd服务须配/etc/systemd/system.conf中defaultlimitnofile或单服务limitnofile;系统级上限需调fs.file-max并sysctl -p生效。

服务器句柄数限制不能只改一处,得按用户、系统、服务三层分别配,漏一层都可能还是报“Too many open files”。
查清楚当前卡在哪
先别急着改,用这几条命令定位瓶颈:
-
看当前会话限制:运行
ulimit -Sn(软限)和ulimit -Hn(硬限),如果都是 1024 或 4096,说明用户级没放开 -
看系统总池子大小:执行
cat /proc/sys/fs/file-max,低于 10 万就容易成为全局瓶颈 -
看具体进程实际值:比如 nginx,先
pgrep nginx拿主进程 PID,再cat /proc/<pid>/limits | grep "Max open files"</pid>,这才是它真正生效的值
用户登录态要配 limits.conf
这个只对 SSH 登录后手动起的程序(比如你敲 java -jar app.jar)有效,systemd 服务完全不读它。
针对Linux系统,phpStudy团队推出全网首家linux docker容器面板,只要一个命令,快速安装面板,在面板里可以自行选择软件版本,可以方便的进行安全配置,就算没有Linux基础也可以快速搭建和管理PHP服务器环境!
- 编辑
/etc/security/limits.conf,加这两行(推荐用具体用户名代替*,避免被覆盖):
your_user hard nofile 65535
- 确认 PAM 加载了限制模块:检查
/etc/pam.d/system-auth或/etc/pam.d/common-session是否有未注释的session required pam_limits.so - 必须重新登录(不是新开终端,而是 SSH 断开重连或图形界面登出再进),否则配置不加载
systemd 服务必须单独设 LimitNOFILE
nginx、MySQL、Java 应用这些用 systemctl start 起的服务,完全无视 limits.conf,只认 systemd 自己的规则。
-
全局生效:编辑
/etc/systemd/system.conf,取消注释并设:
DefaultLimitNPROC=65535
-
单服务生效(更推荐):运行
sudo systemctl edit nginx.service,写入:
LimitNOFILE=655350
- 改完必须执行
sudo systemctl daemon-reload,再sudo systemctl restart nginx - 验证:用
systemctl show nginx.service | grep LimitNOFILE看是否加载成功
系统总上限 fs.file-max 别忘了调
单个进程开了 65535,但系统总共只能分 10 万句柄,高并发时照样挤爆。
- 编辑
/etc/sysctl.conf,追加一行:
- 立即生效:
sudo sysctl -p - 数值建议设为单进程最大值 × 预估最大并发进程数,常见生产环境设到 200 万左右较稳妥










