nginx中ssl证书自动化续期推荐使用certbot的--nginx插件,它可自动修改配置、重载服务;也可用webroot模式配合自定义脚本实现,需确保80端口开放、证书路径为live符号链接,并优先使用reload而非restart。

在 Nginx 中实现 SSL 证书的自动化续期,最常用且推荐的方式是使用 certbot(由 EFF 维护的 Let's Encrypt 官方客户端),配合 Nginx 的 Web 服务器验证模式(如 `--nginx` 插件)或 HTTP-01 挑战方式。它本身不是“第三方脚本”,但可被封装为自动化任务——本质是通过标准工具链完成证书申请、部署与续期,无需手动干预。
使用 certbot 的 --nginx 插件自动续期
certbot 提供原生 Nginx 集成,能自动修改配置、重载服务,适合大多数标准部署:
- 安装 certbot 及 nginx 插件:
sudo apt install certbot python3-certbot-nginx(Ubuntu/Debian) - 首次申请并配置证书:
sudo certbot --nginx -d example.com -d www.example.com,它会自动更新 Nginx 配置并启用 HTTPS - 验证续期是否可用:
sudo certbot renew --dry-run - 系统已自带每日定时任务(systemd timer 或 cron),默认检查过期并续期;无需额外写脚本
手动编写续期后重载 Nginx 的钩子脚本
certbot 支持在续期前后执行自定义命令(hooks),适用于需额外操作的场景(如多服务器同步、通知、备份等):
- 创建续期后执行脚本:
/etc/letsencrypt/renewal-hooks/post/reload-nginx.sh - 内容示例:
#!/bin/sh systemctl reload nginx # 可选:记录日志或触发通知 echo "$(date): SSL renewed and nginx reloaded" >> /var/log/letsencrypt-renew.log
- 赋予执行权限:
chmod +x /etc/letsencrypt/renewal-hooks/post/reload-nginx.sh - certbot 在成功续期后会自动调用该脚本
不依赖 certbot 插件:纯 HTTP-01 + 自定义脚本方案
当无法直接操作 Nginx 配置(如受限环境、容器化部署),可改用 standalone 或 webroot 验证,并用简单脚本协调:
- 使用
--webroot模式,将验证文件写入 Nginx 已配置的静态目录:certbot certonly --webroot -w /var/www/html -d example.com - 续期后,脚本自动复制新证书到指定路径,并发送 reload 信号:
#!/bin/sh certbot renew --quiet --no-self-upgrade if [ $? -eq 0 ]; then cp /etc/letsencrypt/live/example.com/fullchain.pem /etc/nginx/ssl/example.com.crt cp /etc/letsencrypt/live/example.com/privkey.pem /etc/nginx/ssl/example.com.key nginx -t && systemctl reload nginx fi
- 将该脚本加入 cron(如每月 1 号凌晨 2 点):
0 2 1 * * /path/to/renew-nginx.sh
注意事项与常见问题
自动化续期看似简单,但几个细节容易导致失败:
- Nginx 必须监听 80 端口(HTTP-01 验证必需),且防火墙放行
- 确保证书路径在 Nginx 配置中使用
ssl_certificate和ssl_certificate_key指向的是符号链接(certbot 默认维护的 live 目录),而非硬编码具体版本路径 - 避免在 renewal 配置中误设
renew_hook为重启(restart)Nginx,应优先用reload保证零中断 - DNS 解析必须稳定指向当前服务器 IP,否则 DNS-01 验证才适用,但需额外 API 集成(如 Cloudflare 插件)











