Nginx配合Certbot webroot模式可批量签发HTTPS证书,通过统一验证路径、集中配置、脚本化申请与变量化证书引用实现高效管理。

用 Nginx 配合 Certbot 的 webroot 模式批量签发 HTTPS 证书,关键在于统一验证路径、复用配置结构、避免逐站手动修改。它适合管理几十甚至上百个子域名或独立站点的场景,不需要为每个域名单独开 server 块,也不依赖 Nginx 插件自动改配置——更可控、更稳定。
统一验证目录与权限设置
所有域名共用同一个 /.well-known/acme-challenge/ 路径,Nginx 只需一次配置即可支持全部域名验证:
- 创建集中验证目录:
mkdir -p /var/www/letsencrypt - 设为 Nginx 进程可读(如用户为
nginx):chown -R nginx:nginx /var/www/letsencrypt - 确保目录可被外部访问:在任意 HTTP server 块中添加如下 location(推荐放在全局 conf.d/common.conf 中):
location ^~ /.well-known/acme-challenge/ {
root /var/www/letsencrypt;
try_files $uri =404;
}
批量申请证书的脚本化流程
把域名列表写入文件,用循环调用 certbot,避免重复输入和出错:
- 准备域名列表文件
/opt/domains.txt,每行一个主域名(支持多域名合并):
site1.com www.site1.com
site2.com api.site2.com docs.site2.com - 执行批量申请命令(使用
--webroot+ 统一路径):
while read -r line; do
certbot certonly --webroot -w /var/www/letsencrypt \
-d $line \
--email admin@example.com \
--agree-tos --non-interactive --quiet;
done - 成功后,每个域名的证书都存于
/etc/letsencrypt/live/域名/,结构一致,便于后续自动化引用
Nginx 动态加载证书的配置技巧
不建议为每个域名硬编码 ssl_certificate。可利用 Nginx 的变量匹配能力,实现“一个 server 块服务多个 HTTPS 域名”:
- 启用 SNI 支持(Nginx ≥ 1.11.0,默认开启),在 443 server 块中使用变量引用证书:
server {
listen 443 ssl http2;
server_name ~^(?.+)$;
ssl_certificate /etc/letsencrypt/live/$domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$domain/privkey.pem;
# 其余通用配置…
} - 注意:该方式要求所有域名证书均已存在且路径严格匹配;生产环境建议配合
ssl_trusted_certificate和ssl_verify_client off保证兼容性 - 若需更高可靠性,可用 Lua 或 OpenResty 实现运行时证书路径 fallback,但普通场景变量方式已足够
自动续期与零中断 reload
续期不能只靠 certbot renew,必须确保 Nginx 在证书更新后立即生效,且不中断连接:
- 测试续期是否正常:
certbot renew --dry-run - 配置定时任务(例如每天凌晨 2:15):
15 2 * * * /usr/bin/certbot renew --quiet --post-hook "/usr/sbin/nginx -s reload" -
--post-hook比--deploy-hook更稳妥:只要 renew 执行完成(无论是否真更新),就重载 Nginx,避免因未触发更新导致配置未刷新 - 补充检查:加一行日志记录,方便排查失败情况:
15 2 * * * /usr/bin/certbot renew --quiet --post-hook "/usr/sbin/nginx -s reload && echo \$(date) >> /var/log/certbot-renew.log"











