Nginx server块不直接续期,需配合Certbot完成自动续期:专设80端口server块处理HTTP-01验证;HTTPS server块必须引用/etc/letsencrypt/live/下的软链接证书路径;续期后通过--deploy-hook先nginx -t校验再reload确保安全。

Nginx 的 server 块本身不执行续期,但必须精准配合 Certbot 等 ACME 客户端,才能让自动续期真正落地、不出错。关键在三件事:验证能通、证书路径稳、重载不中断。
专设 80 端口验证 server 块
Let’s Encrypt 默认走 HTTP-01 验证,需要 Nginx 在 80 端口响应 /.well-known/acme-challenge/ 路径。不能复用主站配置,要单独建一个轻量 server 块:
- 监听
80,不配 SSL,纯 HTTP 即可 -
location ^~ /.well-known/acme-challenge/指向 Certbot 的验证目录(如/var/www/.well-known/acme-challenge) - 其他所有请求统一 301 跳转到 HTTPS,不影响主站体验
示例配置:
server {
listen 80;
server_name example.com www.example.com;
location ^~ /.well-known/acme-challenge/ {
root /var/www;
try_files $uri =404;
}
location / {
return 301 https://$host$request_uri;
}
}HTTPS server 块正确引用证书路径
主 HTTPS server 必须用 Certbot 维护的符号链接路径,而不是写死某次生成的具体文件名:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;- 绝对不要用
cert.pem或带日期/版本号的路径——live/ 目录下始终是软链,指向最新有效证书
同时建议启用安全参数:
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off;
通过 --deploy-hook 触发安全重载
Certbot 续期后默认不操作 Nginx,必须显式加钩子命令,且顺序不能错:
- 先运行
nginx -t校验语法,失败则终止后续动作,避免 reload 导致服务宕机 - 再执行
systemctl reload nginx,平滑重载,已建立的连接不受影响 - 完整命令:
certbot renew --deploy-hook "nginx -t && systemctl reload nginx"
推荐把这行封装成脚本(如 /usr/local/bin/renew-nginx.sh),再加入 crontab 每周一凌晨 2:15 自动运行:
15 2 * * 1 /usr/local/bin/renew-nginx.sh >/var/log/certbot-renew.log 2>&1
额外加固建议
提升整体可靠性,可补充以下两点:
- 在 Nginx 配置中加
server_tokens off;,隐藏版本信息,减少攻击面 - 检查系统时间是否准确(
timedatectl status),时间偏差超 5 分钟会导致 ACME 验证失败
不复杂但容易忽略


















