Ubuntu 上自动更新 Let's Encrypt 证书(Certbot + Nginx)

一篇可直接落地的 Certbot 自动续期指南:包含 crontab 示例、停启 Nginx hook、续期验证与排错建议。

Let’s Encrypt 证书有效期只有 90 天,线上站点必须配置自动续期,避免证书过期导致 HTTPS 报错。

手动添加 crontab(推荐示例)

如果你希望自己显式管理续期任务,可用 root 用户添加:

1
sudo crontab -e

加入下面一行(每天凌晨 3 点执行一次):

1
0 3 * * * certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx" >> /tmp/certbot-renew.log 2>&1

这条命令的含义:

  • 0 3 * * *:每天 03:00 执行
  • certbot renew:检查并续期即将过期的证书(不会每天都真正续期)
  • --pre-hook:续期前停止 Nginx,避免 80/443 端口冲突(常见于 standalone 模式)
  • --post-hook:续期后启动 Nginx
  • >> /tmp/certbot-renew.log 2>&1:把日志追加写入文件,方便排查

建议先做一次模拟续期

定时任务加完后,先手动验证流程是否可用:

1
sudo certbot renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx" --dry-run

看到模拟续期成功,再交给定时任务长期运行。

常见注意点

  1. 如果你使用的是 webrootnginx 插件,很多场景下不需要停 Nginx,可改为续期后重载配置:
1
certbot renew --deploy-hook "systemctl reload nginx"
  1. certbot renew 只会在证书接近过期时才执行实际续期,所以每天跑一次是正常且常见做法。

  2. 建议把日志目录改成长期可追踪位置(如 /var/log/letsencrypt/),便于长期运维。

记录并分享
使用 Hugo 构建
主题 StackJimmy 设计