本文档说明如何在 Linux 服务器上使用 Certbot 为 NGINX 自动申请、安装和续签 HTTPS 证书。
适用场景:
域名已解析到服务器公网 IP
服务器使用 NGINX 提供 Web 服务
希望通过 Let's Encrypt + Certbot 自动管理证书
1. 原理说明
Let's Encrypt 是一个免费证书颁发机构Certbot 是官方推荐的自动化客户端。
对 NGINX 场景,常见有两种工作方式:
--nginx:Certbot 直接读取并修改 NGINX 配置,自动完成证书签发和 HTTPS 配置
--webroot:Certbot 不修改 NGINX 主配置,只通过网站根目录完成域名验证,适合对线上配置改动要求更严格的场景
如果服务器上 NGINX 配置较规范,优先推荐 --nginx 方式,因为部署最省事。
2. 前置条件
开始前需要满足以下条件:
已有可访问的域名,例如 example.com
域名 A 记录或 AAAA 记录已指向当前服务器
服务器已开放 80 和 443 端口
NGINX 已安装并正常运行
当前用户具备 sudo 权限
建议先确认以下内容:
sudo nginx -t
sudo systemctl status nginx
如果 NGINX 配置本身有错误,Certbot 通常也无法正常接管配置。
3. 安装 Certbot
不同发行版安装方式略有差异,以下为常见方式。
3.1 Ubuntu / Debian
sudo apt update
sudo apt install -y certbot python3-certbot-nginx
3.2 CentOS / Rocky / AlmaLinux
如果系统仓库中已有 Certbot,可直接安装:
sudo dnf install -y certbot python3-certbot-nginx
如果系统较旧,也可能需要通过 snap 或额外仓库安装,此时以系统官方文档为准。
3.3 验证安装
certbot --version
4. NGINX 基础配置要求
在申请证书前,建议先有一个可正常响应 80 端口的站点配置。
一个最小可用示例如下:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
配置完成后执行:
sudo nginx -t
sudo systemctl reload nginx
然后浏览器访问 http://example.com,确认网站可以正常打开。
5. 使用 Certbot 自动签发并写入 NGINX
这是最常用方式。
执行命令:
sudo certbot --nginx -d example.com -d www.example.com
执行过程中通常会要求:
输入邮箱地址,用于接收证书到期提醒
同意服务协议
选择是否接收 EFF 邮件
选择是否将 HTTP 自动跳转到 HTTPS
推荐选择自动跳转 HTTPS。
如果执行成功,Certbot 会自动完成以下动作:
向 Let's Encrypt 申请证书
将证书保存到系统目录
修改 NGINX 配置,加入 ssl_certificate 和 ssl_certificate_key
按需加入 80 -> 443 跳转配置
自动重载 NGINX
6. 证书文件位置
成功申请后,证书通常位于:
/etc/letsencrypt/live/example.com/
常见文件说明:
fullchain.pem:完整证书链
privkey.pem:私钥文件
例如在 NGINX 中通常会使用:
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
注意:不要随意修改 live 目录内的文件,也不要把私钥暴露给无关用户。
7. 自动续签说明
Let's Encrypt 证书默认有效期通常为 90 天,因此必须配置自动续签。
多数新版系统在安装 Certbot 后,会自动创建 systemd timer 或 cron 任务。可通过以下命令检查:
systemctl list-timers | grep certbot
也可以手动测试续签流程:
sudo certbot renew --dry-run
如果显示测试成功,说明自动续签链路基本正常。
8. 续签后自动重载 NGINX
很多情况下,Certbot 插件会在续签后自动处理 NGINX 重载。
如果希望显式指定,可使用 deploy hook:
sudo certbot renew --deploy-hook "systemctl reload nginx"
如果要做成固定配置,可在续签 hook 目录中放置脚本,例如:
/etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
脚本内容示例:
#!/usr/bin/env bash
systemctl reload nginx
赋予执行权限:
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
9. 推荐的 HTTPS 配置示例
Certbot 自动写入后通常已经可用。如果需要手工核对,可参考如下结构:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
root /var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
如果站点是反向代理服务,也可以写成:
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
10. 使用 webroot 方式签发
如果不希望 Certbot 直接改 NGINX 配置,可以使用 webroot 模式。
先确保站点配置中存在验证目录映射,例如:
server {
listen 80;
server_name example.com;
root /var/www/html;
location /.well-known/acme-challenge/ {
root /var/www/html;
}
}
然后执行:
sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com
说明:
certonly 表示只申请证书,不改 NGINX 配置
-w /var/www/html 是验证文件写入目录
这种方式适合:
线上 NGINX 配置由运维统一管理
需要严格控制配置文件变更
有多个复杂 server 块,不想让 Certbot 自动改动
11. 常见故障排查
11.1 域名解析错误
现象:
Certbot 提示无法验证域名
提示连接超时或返回错误主机
排查方法:
dig example.com
ping example.com
确认域名是否已经解析到当前服务器公网 IP。
11.2 80 端口未放行
Let's Encrypt 在签发时通常需要通过 80 端口完成校验。
需要检查:
云服务器安全组
本机防火墙,例如 ufwfirewalld
上游负载均衡是否放通 80
例如 Ubuntu ufw:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
11.3 NGINX 配置冲突
现象:
申请证书时报 nginx: configuration file test failed
多个 server_name 冲突
同一端口被重复配置但逻辑不一致
排查命令:
sudo nginx -t
sudo nginx -T
优先解决 NGINX 自身配置问题,再重新执行 Certbot。
11.4 证书申请频率限制
Let's Encrypt 有速率限制。
如果短时间内多次失败重试,可能触发限制。此时建议:
先用 --dry-run 测试续签流程
确认域名、端口、防火墙都正确后再正式申请
避免脚本中无间隔重复申请
11.5 443 已启用但证书路径错误
现象:
NGINX 可以启动,但浏览器提示证书异常
NGINX 无法重载,提示证书文件不存在
排查:
sudo ls -l /etc/letsencrypt/live/example.com/
sudo nginx -t
确认 fullchain.pem 与 privkey.pem 路径是否写对。
12. 常用命令速查
查看已申请证书
sudo certbot certificates
为 NGINX 自动申请并部署证书
sudo certbot --nginx -d example.com -d www.example.com
仅测试续签
sudo certbot renew --dry-run
正式执行续签
sudo certbot renew
续签后重载 NGINX
sudo certbot renew --deploy-hook "systemctl reload nginx"
13. 推荐实施流程
建议按以下顺序实施:
配置域名解析到服务器公网 IP
确保 NGINX 在 80 端口可正常响应
执行 sudo nginx -t,先修复原有配置错误
安装 certbot 和 python3-certbot-nginx
执行 sudo certbot --nginx -d example.com -d www.example.com
执行 sudo certbot renew --dry-run 验证续签
检查系统是否已存在自动续签定时任务
14. 生产环境建议
在生产环境中,建议额外注意以下几点:
证书私钥目录权限要收紧
NGINX 改动前先备份原配置
申请前先确认域名和防火墙,避免触发频率限制
如果前面有 CDN 或反向代理,确认验证流量能到达源站
续签测试至少执行一次 dry-run
监控 nginx 状态和证书有效期
15. 示例:完整安装流程
下面给出一个从零到可用的最小流程示例:
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx
sudo nginx -t
sudo systemctl enable --now nginx
sudo certbot --nginx -d example.com -d www.example.com
sudo certbot renew --dry-run
执行完成后,可通过浏览器访问:
预期结果:
HTTP 自动跳转到 HTTPS
浏览器证书显示正常
certbot renew --dry-run 测试通过
16. 总结
对于大多数单机 NGINX 站点,最省事的方法是直接使用:
sudo certbot --nginx -d example.com -d www.example.com
该方式能够自动完成:
域名校验
证书申请
NGINX HTTPS 配置写入
后续续签流程接入
如果业务环境对 NGINX 配置改动非常敏感,则可改用 webroot 模式,只让 Certbot 负责签发证书,不直接修改站点配置。
Certbot 自动签发证书给 NGINX 说明
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法