很多的数据库在安装配置阶段,都会对数据库用户的limits做一些特殊的设置。但是经常会遇到配置了不生效的问题,于是我觉得有必要总结一下,以nofile为例来说明limits配置的几个注意点。

配置文件的作用域

limits.conf的文件内容格式如下

  1. [root@adb02 ~]# cat /etc/security/limits.conf
  2. guqi soft nproc 65536
  3. guqi hard nproc 65536
  4. guqi soft nofile 278528
  5. guqi hard nofile 278528
  6. guqi soft stack unlimited
  7. guqi soft core unlimited
  8. guqi hard core unlimited
  9. guqi soft memlock 250000000
  10. guqi hard memlock 250000000

这个配置文件在CentOS 7及以后操作系统中,只作用于通过PAM模块认证的用户了
那么其他情况下,进程的nofile限制其实读取的是systemd的默认配置,即/etc/systemd/system.conf和/etc/systemd/user.conf这两个配置文件。前者是系统级的,后者是用户级的。

PAM模块

PAM使用配置在/etc/pam.d/下的文件,来管理对程序的认证方式。应用程序 调用相应的配置文件,从而调用本地的认证模块。模块放置在/lib64/security下,以加载动态库的形式进,像我们使用su命令时,系统会提示你输入root用户的密码。这就是su命令通过调用PAM模块实现的。
常用的pam库有很多,跟limits相关的是下面这个动态库

pam_limits.so session 定义使用系统资源的上限,root用户也会受此限制,可以通过/etc/security/limits.conf或/etc/security/limits.d/*.conf来设定

因此,不同的服务,如果需要对limits配置,那么需要在/etc/pam.d/里面对应的配置文件里面加上这个so,以sshd服务为例,配置文件的内容示例如下

  1. [root@adb02 ~]# cat /etc/pam.d/sshd
  2. #%PAM-1.0
  3. auth required pam_sepermit.so
  4. auth substack password-auth
  5. auth include postlogin
  6. # Used with polkit to reauthorize users in remote sessions
  7. -auth optional pam_reauthorize.so prepare
  8. account required pam_nologin.so
  9. account include password-auth
  10. password include password-auth
  11. # pam_selinux.so close should be the first session rule
  12. session required pam_selinux.so close
  13. session required pam_loginuid.so
  14. # pam_selinux.so open should only be followed by sessions to be executed in the user context
  15. session required pam_selinux.so open env_params
  16. session required pam_namespace.so
  17. session optional pam_keyinit.so force revoke
  18. session required pam_limits.so
  19. session include password-auth
  20. session include postlogin
  21. # Used with polkit to reauthorize users in remote sessions
  22. -session optional pam_reauthorize.so prepare

然后修改sshd服务本身的配置文件:cat /etc/ssh/sshd_config

  1. vi /etc/ssh/sshd_config
  2. ...
  3. UsePAM yes
  4. ...

后续新建立的ssh连接,就会读取/etc/security/limits.conf文件内的设置了。
注意:如果/etc/security/limits.d/*.conf里面,有相同用户名的配置,会覆盖limits.conf的设置。

systemd的配置

  1. vi /etc/systemd/system.conf
  2. ...
  3. DefaultLimitNOFILE=278528
  4. ...

这种修改方式,必须重启主机才能生效。

内核参数

limits的配置,并不是无限大的,这个上限值有内核参数控制

  1. [root@adb02 ~]# sysctl -a | grep nr_open
  2. fs.nr_open = 1048576

CentOS 7默认单个进程能打开的最大文件句柄数是1048576,如果limits设的比这个大,会出现下面这种ERROR

  1. [root@adb02 ~]# vi /etc/security/limits.conf
  2. ...
  3. #guqi soft nofile 278528
  4. #guqi hard nofile 278528
  5. guqi soft nofile 1048577
  6. guqi hard nofile 1048577
  7. ...
  8. [root@adb02 ~]# su - guqi
  9. Last login: Wed May 12 15:19:35 CST 2021 on pts/0
  10. su: cannot open session: Permission denied
  11. [root@adb02 ~]#

修改这个默认值,按下面的方法做

  1. [root@adb02 ~]# vi /etc/sysctl.conf
  2. ...
  3. fs.nr_open = 104857600
  4. ..
  5. [root@adb02 ~]# sysctl -p