You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何确保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

火山引擎 最新活动