在负载均衡集群环境下,最推荐通过 DNS-01 挑战方式统一续签 Let's Encrypt 证书,或者在单一节点续签后同步至所有节点。
此方案适用于多节点 Nginx 或 HAProxy 架构,风险边界在于 DNS API 权限管理及证书同步期间的服务中断。
先说结论:集群环境续签证书应优先选择 DNS-01 挑战或集中式管理,避免 HTTP-01 挑战因节点文件不一致导致验证失败。
- 适合:多服务器负载均衡架构、无法保证会话粘性(Sticky Session)的场景
- 先准备:DNS 服务商 API 密钥或共享存储挂载权限
- 验收:所有节点证书有效期一致且服务无中断
命令速用版
使用 acme.sh 配合 DNS API 可直接在任意节点完成续签,无需 Web 服务器参与验证。
export LE_API="https://acme-v02.api.letsencrypt.org/directory"
export DNS_API_KEY="your_dns_api_key"
acme.sh `--issue` `--dns` dns_provider -d example.com -d www.example.com
acme.sh `--install-cert` -d example.com \
`--cert-file` /etc/ssl/certs/example.com.crt \
`--key-file` /etc/ssl/private/example.com.key \
`--reloadcmd` "systemctl reload nginx"
若使用集中式续签,需在主节点执行续签后,通过 rsync 或配置管理工具将证书分发至集群。
为什么会这样
HTTP-01 挑战要求验证文件必须存在于请求到达的具体节点上,而负载均衡会将请求随机分发。
Let's Encrypt 的 HTTP-01 验证机制需要访问 `http://domain/.well-known/acme-challenge/` 下的特定文件。在集群环境中,如果验证请求被负载均衡器分发到未存放挑战文件的节点,验证将失败。DNS-01 挑战通过修改 DNS TXT 记录验证域名所有权,不依赖具体 Web 服务器节点,因此更适合集群架构。
分步处理
第一步:选择验证方式并准备凭证。
适用场景:所有集群节点均可访问外网或具备 DNS API 调用权限。操作动作:在 DNS 服务商控制台生成 API Key。风险边界:API Key 泄露可能导致 DNS 记录被篡改,需限制 Key 权限仅允许修改 TXT 记录。
第二步:执行证书续签命令。
适用场景:选定的一台管理节点。操作动作:运行 certbot 或 acme.sh 的 DNS 挑战命令。验证结果:命令输出显示 Certificate success。风险边界:DNS 传播延迟可能导致验证超时,公开资料中没有看到可靠的量化数据,通常建议预留几分钟等待。
第三步:同步证书文件至所有节点。
适用场景:多节点 Web 服务器。操作动作:使用 rsync 或 Ansible 将 crt 和 key 文件分发至集群各节点相同路径。验证结果:各节点文件哈希值一致。风险边界:同步过程中旧证书可能被覆盖,需确保原子操作或先备份。
第四步:重载 Web 服务。
适用场景:所有节点。操作动作:执行 `nginx -s reload` 或 `systemctl reload nginx`。验证结果:进程不中断,新连接使用新证书。风险边界:配置错误可能导致服务启动失败,需先执行 `nginx -t` 检查配置。
怎么验证是否生效
使用 OpenSSL 命令检查各节点证书有效期是否更新。
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
查看日志确认重载成功,Nginx 日志通常位于 `/var/log/nginx/error.log`,搜索 reload 相关记录。浏览器访问 HTTPS 站点,点击锁图标查看证书有效期,确认所有节点返回的证书一致。
常见坑
Let's Encrypt 存在速率限制,每周每个注册域名最多颁发 50 张证书,频繁重试可能触发限制。
证书文件权限错误会导致 Web 服务无法启动,私钥文件权限应设置为 600,属主为 root 或运行 Web 服务的用户。集群时间不同步可能导致证书验证逻辑异常,确保所有节点使用 NTP 同步时间。重载服务时若配置有误,可能导致旧进程退出新进程启动失败,造成服务中断,务必先测试配置。
常见问题
HTTP-01 挑战在集群中完全不可用吗?
不是完全不可用,但需要配合共享存储或会话粘性。
若使用 NFS 共享 `.well-known` 目录,或配置负载均衡器将挑战请求固定转发至单一节点,HTTP-01 挑战也可行,但配置复杂度高于 DNS-01。
证书同步是否需要停机?
不需要停机,平滑重载即可生效。
Nginx 等主流 Web 服务器支持平滑重载,新连接使用新证书,旧连接保持至关闭,但需确保所有节点同步完成后再依次重载,避免部分节点证书过期。
自动化续签如何部署?
建议在独立管理节点设置 Cron 任务,完成后触发远程重载。
避免在每台 Web 服务器上独立运行续签任务,以免触发速率限制或造成证书版本不一致,集中管理更可靠。
参考来源
- Let's Encrypt Official Docs, Validation Types, https://letsencrypt.org/docs/challenge-types/
- acme.sh Wiki, DNS API, https://github.com/acmesh-official/acme.sh/wiki/dnsapi
- Nginx Documentation, Controlling Nginx, https://nginx.org/en/docs/control.html