linux资源限制通过/etc/security/limits.conf由pam pam_limits.so在登录时生效,需确保pam启用、重新登录,并注意systemd和容器需单独配置;推荐用“user – nofile 65535”同时设软硬限。

Linux系统资源限制主要靠 /etc/security/limits.conf 实现,它不是内核配置,而是由 PAM 模块 pam_limits.so 在用户登录时加载生效的。配置写对了,但没登录新会话、没启用 PAM 或被 systemd 绕过,都会导致不生效。
limits.conf 的基本格式和含义
每行遵循四字段结构:domain type item value
- domain:作用对象,可以是用户名(如
www-data)、组名(如@devs),或通配符*表示所有普通用户(不包括 root) - type:限制类型,
soft是当前生效值,hard是上限,-表示同时设置软硬限制 - item:资源类型,最常用的是
nofile(文件描述符数)、nproc(最大进程/线程数),其他还有stack、as、memlock等 - value:数值,支持整数或
unlimited(慎用)
为什么 soft 和 hard 要配对设置
soft 限制不能高于 hard 限制,且普通用户只能调高 soft 值(到 hard 范围内),不能动 hard 值。root 用户可修改两者。若只设 soft 不设 hard,后续 ulimit -Hn 查看可能显示默认低值(如 4096),导致服务启动时因硬限不足失败。
- 推荐写法:
www-data - nofile 65535(一行搞定软硬) - 避免只写:
www-data soft nofile 65535(hard 仍为系统默认,可能卡住服务) - root 用户不受
*规则影响,如需限制 root,必须显式写root - nofile 65535
配置生效的前提条件
limits.conf 不是改完就生效的配置文件,它依赖完整的 PAM 流程:
- 确认
/etc/pam.d/login、/etc/pam.d/sshd等登录服务中包含session required pam_limits.so - 修改后必须退出当前会话并重新登录(SSH 重连、图形界面注销再进),
su - user也有效,但su user不加载新 limits - systemd 服务(如 nginx、redis)默认不读取 limits.conf,需单独在
/etc/systemd/system/*.service.d/override.conf中设LimitNOFILE=65535 - 容器环境(如 docker)需用
--ulimit nofile=65535:65535显式传递,宿主机 limits.conf 对容器内进程无效
常见陷阱与验证方法
配置看似正确却无效,多数出在验证方式或层级覆盖上:
- 用
ulimit -n查看当前 shell 的 nofile 值,用ulimit -Hn和ulimit -Sn分别确认硬软限制是否一致 - 不要只查 root 或当前终端,要切换目标用户验证:
sudo -u www-data bash -c 'ulimit -n' - systemd 服务要用
systemctl show -p LimitNOFILE nginx.service查,不是ulimit - 注意
/etc/security/limits.d/*.conf下的文件按字母序加载,后加载的会覆盖前面同 domain+item 的设置 - 某些发行版(如新版 ubuntu)默认禁用 PAM limits,需检查
/etc/pam.d/common-session是否含pam_limits.so