Nginx + Certbot webroot 模式实现HTTPS证书自动化维护的核心是复用验证目录与隔离证书管理:统一使用 /var/www/certbot 作验证根目录,Nginx 全局配置 location ^~ /.well-known/acme-challenge/;各域名组单独执行 certbot 命令申请证书并独立存储;通过 include 模板化 HTTPS 配置;续期时用 deploy hook 自动重载 Nginx。

用 Nginx + Certbot 的 webroot 模式做大规模 HTTPS 证书自动化维护,核心不在于“多”,而在于“复用”和“隔离”——同一套验证路径可支撑多个域名,每个域名证书独立存储、独立续期,互不影响。
webroot 验证目录要统一规划
不要为每个域名建单独的 /var/www/letsencrypt-example.com 这类目录。所有域名共用一个验证根目录(如 /var/www/certbot),Nginx 只需一次配置就能响应全部域名的 /.well-known/acme-challenge/ 请求。
- 创建统一验证目录:
sudo mkdir -p /var/www/certbot && sudo chown nginx:nginx /var/www/certbot - Nginx 全局 HTTP server 块中添加固定 location(不随域名变化):
location ^~ /.well-known/acme-challenge/ {<br> root /var/www/certbot;<br> try_files $uri =404;<br>} - 该配置放在
/etc/nginx/conf.d/default.conf或主配置的 http 块内,避免重复写入每个站点配置
批量申请证书的命令要点
certbot 不支持一次命令签发多个完全无关的域名(如 a.com、b.net、c.org),但可对单个域名加多个子域(如 -d example.com -d www.example.com -d api.example.com)一次性签发一张证书。
- 用
--webroot -w /var/www/certbot指定统一验证路径 - 每个域名组单独执行 certbot 命令,避免混杂导致某一个失败影响全部:
certbot certonly --webroot -w /var/www/certbot -d site1.com -d www.site1.com --email admin@site1.com --agree-tos --non-interactive - 证书生成后自动存入
/etc/letsencrypt/live/site1.com/,路径结构清晰,便于后续脚本按目录轮询
Nginx HTTPS 配置模板化管理
不要手动为每个域名写一遍完整的 server { listen 443 ssl; ... }。采用 include 机制,把证书路径、SSL 参数、网站逻辑分离。
- 在
/etc/nginx/conf.d/ssl/下为每个域名建一个 conf 文件,例如site1.com.conf: - 内容只含关键段:
server {<br> listen 443 ssl http2;<br> server_name site1.com www.site1.com;<br> ssl_certificate /etc/letsencrypt/live/site1.com/fullchain.pem;<br> ssl_certificate_key /etc/letsencrypt/live/site1.com/privkey.pem;<br> include /etc/nginx/snippets/ssl-params.conf; # 统一 SSL 策略<br> root /var/www/site1;<br> index index.html;<br>} - HTTP server 块中统一重定向:
return 301 https://$host$request_uri;(无需 per-domain 判断)
自动续期与部署闭环的关键动作
Let’s Encrypt 证书有效期 90 天,certbot 的 renew 命令默认检查所有已存在证书,但不会自动重载 Nginx —— 这一步必须显式触发。
- 创建续期钩子脚本
/etc/letsencrypt/renewal-hooks/deploy/nginx-reload.sh: - 内容仅一行:
systemctl reload nginx,并赋予可执行权限 - 验证钩子是否生效:
sudo certbot renew --dry-run,观察日志末尾是否有 “Running deploy hook” 和 “Reloading nginx” - 确认系统定时任务已启用:
systemctl list-timers | grep certbot(CentOS 8 默认通过 systemd timer 启动certbot-renew.timer)


















