systemd service 设置limit,不生效问题

本文详细解析了Centos7系统中如何正确配置系统资源限制,特别是针对通过systemd启动的服务,如nginx,如何修改最大文件打开数和进程数。文章指出,在Centos7中,/etc/security/limits.conf的配置对systemd服务不生效,并提供了正确的配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博文:
https://www.cnblogs.com/lemon-le/p/8505089.html
http://smilejay.com/2016/06/centos-7-systemd-conf-limits/

问题简述:Centos7下修改系统的最大文件打开数的时候,对系统启动的进程不生效

问题详述:Centos7下需修改系统最大文件打开数为100000,进程数为50000,于是做了如下操作

说 明:此问题只出现在centos7下,centos6版本不存在此问题

1:记录未修改之前的ulimit值

2:修改配置文件

vim /etc/security/limits.conf 在后面添加

  •  soft    nofile  100000
    
  •  hard    nofile  100000
    
  •  soft    nproc   65535
    
  •  hard    nproc   65535
    

重启机器,修改 /etc/security/limits.conf 里的配置后,需重启机器才能生效

3:查看修改后的ulimit值

4:在这里看起来一切都很正常,也许一不小心就入坑了。为了对比现象,需要安装两个nginx,一个源码安装,一个yum安装

源码安装:(简单安装,只是为了验证和测试,不指定安装路径,默认是在/usr/local/nginx下)

wget http://nginx.org/download/nginx-1.8.1.tar.gz
tar -zxvf nginx-1.8.1.tar.gz
cd nginx-1.8.1
./configure
make && make install

yum安装

yum -y install nginx

5:现象

1)先启动源码编译的nginx,并查看进程号及limit值,如下

启动nginx: /usr/local/nginx/sbin/nginx
查看进程: ps -ef |grep nginx
查看某个进程的limit值: cat /proc/进程号/limits

2)yum安装nginx启动

启动方法:systemctl start nginx.service ,然后查看进程号及其limit值,如下:

到这里问题就来了,为什么通过systemctl启动的nginx对limit的设置不生效 ?????
然后查看了1号进程的limit值( cat /proc/1/limits ),发现也是对修改/etc/security/limits.conf文件里的最大文件打开数和最大进程数没有生效

6:原因

仔细查看/etc/security/limits.conf文件的注释,说明了对系统服务不生效

7:解决办法

在Centos7系统中,使用Systemd替代了之前的SysV。/etc/security/limits.conf文件的配置作用域缩小了。/etc/security/limits.conf的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。因此登录用户的限制,通过/etc/security/limits.conf与/etc/security/limits.d下的文件设置即可。

对于systemd service的资源设置,则需修改全局配置,全局配置文件放在/etc/systemd/system.conf和/etc/systemd/user.conf,同时也会加载两个对应目录中的所有.conf文件/etc/systemd/system.conf.d/.conf和/etc/systemd/user.conf.d/.conf。system.conf是系统实例使用的,user.conf是用户实例使用的。

vim /etc/systemd/system.conf

DefaultLimitNOFILE=100000
DefaultLimitNPROC=65535

重启后,systemctl start nginx启动,然后根号进程号查看资源限制,得到

8:用到的相关命令

1)查看当前进程的最大可以打开的文件数

 cat /proc/进程ID/limits

2)查看当前进程实时打开的文件数

 lsof -p PID |wc -l

3)查看系统总限制打开文件的最大数量

 cat /proc/sys/fs/file-max

注:若设置不生效,查看包含的目录下的配置文件是否覆盖,如/etc/security/limits.d/下的文件是否覆盖了/etc/security/limits.conf设置的值

[root@iZ7xvhattm1dd3arcr9l8uZ redis-stable]# systemctl status redis ● redis.service - Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled) Drop-In: /etc/systemd/system/redis.service.d └─limit.conf Active: failed (Result: start-limit) since Fri 2025-08-15 12:14:50 CST; 1h 53min ago Main PID: 13964 (code=exited, status=0/SUCCESS) Aug 15 12:14:50 iZ7xvhattm1dd3arcr9l8uZ systemd[1]: redis.service holdoff time over, scheduling restart. Aug 15 12:14:50 iZ7xvhattm1dd3arcr9l8uZ systemd[1]: Stopped Redis Server. Aug 15 12:14:50 iZ7xvhattm1dd3arcr9l8uZ systemd[1]: start request repeated too quickly for redis.service Aug 15 12:14:50 iZ7xvhattm1dd3arcr9l8uZ systemd[1]: Failed to start Redis Server. Aug 15 12:14:50 iZ7xvhattm1dd3arcr9l8uZ systemd[1]: Unit redis.service entered failed state. Aug 15 12:14:50 iZ7xvhattm1dd3arcr9l8uZ systemd[1]: redis.service failed. Aug 15 12:46:08 iZ7xvhattm1dd3arcr9l8uZ systemd[1]: redis.service has more than one ExecStart= setting, which is only allowed for Type=oneshot services. Refusing. Aug 15 12:48:02 iZ7xvhattm1dd3arcr9l8uZ systemd[1]: redis.service has more than one ExecStart= setting, which is only allowed for Type=oneshot services. Refusing. Aug 15 12:48:02 iZ7xvhattm1dd3arcr9l8uZ systemd[1]: redis.service has more than one ExecStart= setting, which is only allowed for Type=oneshot services. Refusing. Warning: redis.service changed on disk. Run 'systemctl daemon-reload' to reload units.
最新发布
08-16
<think>我们正在处理用户关于nginx服务无法启动的问题。根据系统级指令,我们需要使用正确的中文回答,并遵循LaTeX格式要求。同时,在回答末尾生成相关问题,并确保引用标识自然添加。 首先,分析问题:nginx服务无法启动的可能原因及解决方案。我们需要列举常见原因并提供对应的解决方法。 常见原因包括: 1. 配置文件语法错误:nginx在启动时会检查配置文件(通常是nginx.conf)的语法,如果有错误则拒绝启动。 2. 端口冲突:nginx默认监听80和443端口,如果这些端口已被其他进程占用,则启动失败。 3. 权限问题:nginx可能需要以root权限启动或监听特权端口(<1024的端口)时没有权限。 4. 文件路径错误:配置中指定的文件(如SSL证书、日志文件目录等)不存在或权限不足。 5. 依赖问题:缺少必要的模块或库。 6. 资源限制:如打开文件数限制等。 针对这些原因,我们可以提供以下解决方案: 1. **检查配置文件语法**: 使用命令:`nginx -t` 或 `nginx -T`(显示完整配置并测试)。这会检查配置文件语法并指出错误位置。修复错误后重新启动。 2. **检查端口占用**: 使用命令:`netstat -tuln | grep &#39;:80\|:443&#39;`(Linux)或查看其他操作系统对应命令。如果端口被占用,可以停止占用端口的进程,或修改nginx配置使用其他端口。 3. **检查权限**: - 确保nginx进程有权限访问其需要的文件(如网站根目录、日志目录等)。 - 如果以非root用户启动却试图监听特权端口,需要改为非特权端口(如8080)或使用root启动(不推荐)或设置capabilities(如`setcap &#39;cap_net_bind_service=+ep&#39; /path/to/nginx`)。 4. **检查文件路径**: 在配置文件中,确保所有路径(如SSL证书、访问日志、错误日志等)指向的文件存在且nginx进程有读取权限。 5. **检查依赖**: 如果nginx是动态编译的,确保所有依赖的库已安装。可以使用`ldd`命令检查nginx二进制文件的依赖(`ldd $(which nginx)`)。 6. **调整资源限制**: 如果nginx需要打开大量文件,可能需要调整系统限制(如`ulimit -n`)或修改nginx的`worker_rlimit_nofile`指令。 此外,查看错误日志是诊断问题的重要步骤。nginx错误日志通常位于`/var/log/nginx/error.log`或配置中指定的位置。 最后,生成相关问题: 1. 如何配置nginx的虚拟主机? 2. 如何为nginx配置SSL证书? 3. nginx如何实现负载均衡? 在回答中,我们可能需要引用一些配置示例或命令输出,但注意不要使用代码块(根据指令,行内数学表达式使用$...$,独立公式用$$...$$,但这里主要是命令和配置,所以用代码块是允许的,因为指令示例中使用了代码块)。但是注意指令要求:独立公式才用$$...$$,其他情况用行内$...$。而配置和命令不属于数学表达式,所以我们可以用代码块(如示例中的Python代码块),因此我们也可以使用代码块来展示命令和配置片段。 注意:指令要求使用中文回答。 现在组织回答:</think>### Nginx服务无法启动的原因及解决方案 Nginx服务无法启动通常由以下原因引起,请按顺序排查: #### 1. **配置文件语法错误**(最常见原因) - **检测方法**:执行测试命令 ```bash nginx -t ``` - **典型报错**: `nginx: [emerg] invalid number of arguments in "listen" directive` `nginx: configuration file /etc/nginx/nginx.conf test failed` - **解决方案**: - 根据报错行号定位错误(如缺少分号、括号不匹配) - 使用`grep -n "关键字" /etc/nginx/*`快速定位配置位置 - 修复后重新加载:`nginx -s reload` #### 2. **端口冲突** - **检测方法**: ```bash ss -tulpn | grep &#39;:80\|:443&#39; # 检查80/443端口占用 ``` - **解决方案**: - 终止占用进程:`kill -9 <PID>` - 或修改Nginx监听端口: ```nginx server { listen 8080; # 改为非特权端口 ... } ``` #### 3. **文件权限问题** - **常见场景**: - Nginx用户(通常为`www-data`或`nginx`)无权访问: - 网站根目录(如`/var/www/html`) - SSL证书文件(如`/etc/ssl/certs/`) - 日志目录(如`/var/log/nginx/`) - **解决方案**: ```bash chown -R nginx:nginx /var/www # 修改目录属主 chmod -R 755 /var/log/nginx # 设置目录权限 ``` #### 4. **资源限制** - **检测方法**: ```bash tail -f /var/log/nginx/error.log # 查看实时错误日志 ``` - **典型错误**: - `worker_connections exceed open file resource limit`:文件句柄不足 - `cannot allocate memory`:内存不足 - **解决方案**: - 修改系统限制: ```bash ulimit -n 65535 # 临时提高打开文件数 echo "nginx - nofile 65535" >> /etc/security/limits.conf # 永久生效 ``` #### 5. **SELinux/AppArmor限制**(Linux安全模块) - **检测方法**: ```bash audit2allow -a # 查看SELinux拒绝记录 dmesg | grep nginx # 检查内核日志 ``` - **解决方案**: ```bash setsebool -P httpd_can_network_connect 1 # SELinux放行网络 aa-complain /usr/sbin/nginx # AppArmor切换为投诉模式 ``` #### 6. **其他原因** - **PID文件残留**:删除旧PID文件 `rm /run/nginx.pid` - **模块加载失败**:检查`load_module`指令路径是否正确 - **IPv6配置错误**:若未启用IPv6,需在`listen`指令移除`[::]:80` > **关键诊断工具**: > - 使用`journalctl -u nginx.service`查看systemd日志 > - 通过`nginx -T`导出完整配置检查隐藏错误 > - 空配置启动测试:`nginx -c /dev/null`(隔离基础环境问题)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值