正确配置 /etc/security/limits.conf 需明确作用对象、合理设置软硬限制、确保 pam 机制生效;它仅对通过 pam 登录的用户会话(如 ssh、su -、图形登录)有效,不作用于 systemd 服务或非登录 shell。

正确配置 /etc/security/limits.conf 需抓住三个关键:作用对象明确、软硬限制合理、PAM机制生效。它只对通过 PAM 登录的用户会话起作用(如 SSH、su、图形登录),不直接影响 systemd 服务或后台守护进程。
明确配置格式与字段含义
每行遵循固定四字段结构:domain type item value,例如:
-
domain:可填用户名(
www-data)、组名(@devs)、通配符(*表示所有用户);注意%仅用于maxlogins等特定项 -
type:用
soft(当前生效值,用户可自行调低)、hard(上限,仅 root 可调高)、-(同时设软硬限) -
item:核心项是
nofile(打开文件数),其他常见项包括nproc(进程数)、stack(栈大小 KB) -
value:支持数字(如
65535)或unlimited;软限不能超过硬限
写入典型配置示例
以提升普通用户和 web 服务账户的文件描述符上限为例:
- 对所有用户统一设限(推荐生产环境基础配置):
* soft nofile 65535* hard nofile 65535 - 为特定用户强化限制(如数据库用户需更高内存锁定):
mysql - memlock unlimitedmysql soft nofile 100000mysql hard nofile 100000 - 限制某组用户进程数防滥用:
@guests hard nproc 20
配置须写在 /etc/security/limits.conf 文件末尾,或放入 /etc/security/limits.d/90-custom.conf(更易维护,且按字母序加载,后加载者覆盖前项)。
确保 PAM 加载并验证生效
该文件依赖 pam_limits.so 模块才能生效。检查是否已启用:
- 运行
grep pam_limits.so /etc/pam.d/common-session,若无输出,需追加:session required pam_limits.so - 修改后必须退出当前会话并重新登录(SSH 重连、图形界面重新登录),已有 shell 不会自动更新
- 验证是否生效:
在新会话中执行ulimit -Sn(软限)和ulimit -Hn(硬限),应显示配置值
避开常见失效陷阱
很多配置“写了却没用”,原因常出在这里:
-
systemd 服务不读 limits.conf:nginx、redis 等由 systemd 启动的服务完全忽略此文件,必须改
LimitNOFILE=在 service 单元中 - root 用户受额外策略约束:部分发行版对 root 默认禁用某些限制,建议测试时用普通用户验证
-
limits.d/ 下同 domain 配置会覆盖 limits.conf:比如
/etc/security/limits.d/01-nofile.conf里也有*规则,它将生效,原 conf 文件对应行被跳过 -
shell 启动方式影响:非登录 shell(如脚本中直接
bash -c)不触发 PAM 会话,也不会加载 limits











