Certbot 配合 Nginx 实现 HTTPS 自动化:统一 ACME 验证目录、分组签发证书、模板化 SSL 配置、续期自动重载 Nginx,全程避免手动误配与权限风险。

直接用 Certbot 配合 Nginx,几分钟就能让网站跑上 HTTPS,关键不是“装完就完”,而是把验证、签发、部署、续期这四步串成一条不掉链子的流水线。
统一验证路径,避免重复配置
所有域名共用一个 ACME 验证目录,比如 /var/www/certbot,而不是为每个站点建单独目录(如 /var/www/letsencrypt-site1.com)。这样 Nginx 只需一次 location 配置,就能响应全部域名的 /.well-known/acme-challenge/ 请求:
- 创建目录并设好权限:
sudo mkdir -p /var/www/certbot && sudo chown nginx:nginx /var/www/certbot - Nginx 全局配置中(如
/etc/nginx/conf.d/default.conf)加入: location ^~ /.well-known/acme-challenge/ {
root /var/www/certbot;
try_files $uri =404;
} - 这条规则放在 http 块或默认 server 块里,不用复制到每个站点配置中
分组申请证书,互不干扰
不要试图用一条 certbot 命令签发多个完全无关的主域(比如 a.com、b.net),Certbot 不支持这种跨域批量。但可以对同一主域下的多个子域(如 site1.com、www.site1.com、api.site1.com)一次性签发一张证书:
- 每个域名组单独执行命令,失败不影响其他:
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 运行且配置复杂,优先选
certonly模式,不自动改配置,更可控
模板化 HTTPS 配置,杜绝手误
别在每个 server 块里手动写一遍 ssl_certificate 路径——少输一个字母,reload 就报错。用 include 分离证书路径与业务逻辑:
- 在
/etc/nginx/conf.d/ssl/下为每个域名建独立 conf 文件,例如site1.com.conf - 文件内容只保留关键段:server {
listen 443 ssl http2;
server_name site1.com www.site1.com;
ssl_certificate /etc/letsencrypt/live/site1.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site1.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
} - 确保主配置中已启用该目录:
include /etc/nginx/conf.d/ssl/*.conf;
续期自动重载,不靠人工盯守
Certbot 默认每天两次检查续期(systemd timer),但光续上证书还不够,得让 Nginx 立刻生效:
- 在 renew 命令中加
--deploy-hook "nginx -s reload",每次成功续期后自动重载 - 或写成 deploy hook 脚本(如
/etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh),加执行权限后放进去 - 私钥权限必须是
600,不能设成644,否则安全扫描会告警“私钥泄露”


















