Nginx 集成 Certbot 实现证书自动续期需配置 HTTP-01 验证路径、手动校验 Nginx SSL 配置、验证定时任务并设置 deploy-hook 自动重载 Nginx,全程本地可控。

在 Nginx 中集成 Certbot 实现证书自动续期,核心是让 Certbot 能正确验证域名所有权,并把签发的证书交给 Nginx 使用,再借助系统定时任务完成定期续期。整个过程不依赖外部服务,全部本地可控。
配置 Nginx 支持 ACME HTTP 验证
Certbot 默认使用 HTTP-01 挑战方式验证域名,需要 Nginx 将 /.well-known/acme-challenge/ 路径的请求准确转发给 Certbot 的本地服务。不能让这些请求被重定向、被代理或被其他 location 规则拦截。
- 在对应站点的 server 块中添加专用 location:
location ^~ /.well-known/acme-challenge/ {
root /var/www/html;
default_type text/plain;
}- 确保该路径所在目录(如
/var/www/html/.well-known/acme-challenge/)Nginx 进程有读写权限 - 如果站点启用了 HTTPS 重定向,需确保 HTTP server 块(端口 80)依然存在并启用该 location,否则挑战会失败
首次申请证书并配置 Nginx 使用
首次运行 Certbot 时,它会自动生成证书、私钥和完整链文件,并修改 Nginx 配置(可选)。建议手动控制配置变更,避免自动改写引发问题。
- 运行命令申请证书(以 example.com 为例):
sudo certbot --nginx -d example.com -d www.example.com
- Certbot 会尝试自动修改 Nginx 配置,添加
ssl_certificate和ssl_certificate_key指令 - 建议检查生成的配置片段(通常在
/etc/nginx/sites-enabled/或对应 server 块中),确认路径是否正确,例如:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
- 执行
sudo nginx -t && sudo systemctl reload nginx确保配置生效
验证自动续期机制是否就绪
Certbot 安装后默认已配置 systemd timer(Ubuntu/Debian)或 cron(CentOS/RHEL),但必须验证其是否启用且能正常运行。
- 手动触发一次续期测试(不实际更新,仅模拟):
sudo certbot renew --dry-run
- 若输出
Successfully received certificate,说明验证流程通顺 - 查看定时任务状态:
# Ubuntu/Debian sudo systemctl list-timers | grep certbot <h1>CentOS/RHEL</h1><p>sudo crontab -l | grep certbot
- 确保定时任务指向
certbot renew,且未被注释或禁用
续期后自动重载 Nginx
Certbot 续期成功后默认不会自动重载 Nginx,需通过 --deploy-hook 显式触发。
- 编辑 Certbot 的自动续期配置文件(推荐全局设置):
sudo nano /etc/letsencrypt/cli.ini
- 添加以下内容:
deploy-hook = systemctl reload nginx
- 该 hook 在每次成功续期后执行,确保新证书立即生效
- 也可写成更安全的命令:
nginx -t && systemctl reload nginx,避免配置错误导致服务中断
整个流程跑通后,Certbot 会在证书到期前约 30 天自动检查并续期,无需人工干预。关键点在于验证路径畅通、配置路径准确、重载动作可靠。


















