如何确保Nginx的systemd服务配置中Restart=always始终生效?
如何确保Nginx的systemd服务配置中Restart=always始终生效?
遇到这种配置被意外覆盖的情况确实头疼,我来给你几个实用的方案确保Restart=always一直生效,顺便帮你排查下可能的原因:
一、用systemd Drop-In配置(最推荐的方式)
直接修改系统默认的/lib/systemd/system/nginx.service文件很容易被包更新、工具操作覆盖——比如当你通过包管理器更新Nginx时,系统会用新版本的默认服务文件替换掉你修改过的旧文件。
systemd提供了Drop-In配置目录的机制,让你可以叠加自定义配置,完全不会被系统默认文件的变更影响:
- 首先创建Nginx服务的Drop-In目录:
sudo mkdir -p /etc/systemd/system/nginx.service.d - 在这个目录下新建一个自定义配置文件(比如
restart-always.conf):sudo nano /etc/systemd/system/nginx.service.d/restart-always.conf - 写入以下内容:
[Service] Restart=always - 保存退出后,重新加载systemd配置并重启Nginx:
sudo systemctl daemon-reload sudo systemctl restart nginx
这样不管后续系统默认的nginx.service怎么变,这个Drop-In配置都会强制生效Restart=always。
二、排查配置消失的原因
你提到可能是添加新用户或证书重签发导致的,可以从这几个方向查:
- 包更新检查:用
dpkg --list | grep nginx查看Nginx的最近更新时间,如果配置消失的时间和更新时间吻合,那就是包更新覆盖了默认服务文件——这也是最常见的原因。 - 证书工具排查:certbot这类证书工具一般只会修改Nginx的站点配置,不会碰systemd服务文件,但你可以查看
/var/log/letsencrypt/letsencrypt.log确认有没有相关操作。 - 用户操作记录:用
last查看服务器的用户登录记录,或者检查相关用户的history命令历史(如果没被清空的话),看有没有人误修改了服务文件。
三、验证配置是否生效
做完配置后,你可以用以下命令确认Restart=always已经生效:
systemctl show nginx | grep Restart
输出应该会显示Restart=always。另外还可以做个实操测试:手动杀死Nginx进程,看systemd会不会自动重启它:
sudo pkill nginx # 等几秒后查看状态 systemctl status nginx
如果服务自动恢复运行,就说明配置生效了。
四、不推荐的方案:锁定原始服务文件
如果你一定要修改原始的/lib/systemd/system/nginx.service,可以用chattr命令锁定文件,防止被修改:
sudo chattr +i /lib/systemd/system/nginx.service
不过这个方法有个弊端:当你后续更新Nginx时,包管理器会因为无法修改这个文件而报错,需要先解锁(sudo chattr -i ...)更新,之后再重新锁定,比较麻烦,所以还是优先用Drop-In配置。
备注:内容来源于stack exchange,提问作者Jerome




