跳到主要内容

第 17 课:通过宝塔配置 HTTPS

第五阶段 · 正式生产环境 · 面向 Docker 初学者

本课完成标准​

你能够理解 HTTPS 和证书的作用;开放并检查 443 端口;通过宝塔申请 Let’s Encrypt 证书;开启 HTTP 到 HTTPS 跳转;确认静态资源、登录页和 API 都能通过 HTTPS 访问;知道证书申请失败和过期时怎么排查。

1. HTTPS 到底解决什么问题​

HTTP 像把明信片寄出,传输内容可能被旁观者看到;HTTPS 是给浏览器到网站入口的通信加密。证书还帮助浏览器确认“这个域名确实由这个站点使用”。

本项目的链路是:

浏览器 --HTTPS:443--> 宝塔 Nginx --内部 HTTP--> FastAPI:8000

宝塔 Nginx 负责证书和 TLS 加密,Docker 中的 FastAPI 仍然监听内部 8000。通常不需要在 FastAPI 容器里再配置证书。

2. 申请证书前的准备​

证书申请通常要求域名已经解析到 ECS,并且验证服务可以访问服务器。

  1. 确认 api.example.com 的 A 记录指向 ECS 公网 IP。
  2. 阿里云安全组开放 TCP 80 和 443。
  3. 宝塔面板中的网站名称与域名完全一致。
  4. 暂时不要让安全组拦截 80,因为证书机构可能用 HTTP 验证域名所有权。

可以先验证:

nslookup api.example.com
curl -I http://api.example.com/login

3. 在宝塔申请 Let’s Encrypt 证书​

  1. 宝塔 → 网站 → 找到 api.example.com。
  2. 点击 设置 → SSL。
  3. 选择 Let’s Encrypt。
  4. 勾选当前域名,填写可接收通知的邮箱,点击申请。
  5. 申请成功后确认页面显示有效期和证书状态。

Let’s Encrypt 是常见的免费证书来源;也可以使用阿里云或其他 CA 签发的证书。不要把证书私钥提交到 GitHub。可参考 Let’s Encrypt 官方文档 和 Certbot 文档。

4. 开启 HTTPS 和自动跳转​

在宝塔 SSL 页面:

  1. 确认“SSL 开关”已开启。
  2. 开启“强制 HTTPS”(有些版本叫“强制跳转 HTTPS”)。
  3. 保存并重载 Nginx。

开启后,访问 http://api.example.com/login 应该返回 301 或 302,目标是 https://api.example.com/login。

先确保 HTTPS 本身能访问,再开启强制跳转。否则可能把所有用户一起跳转到一个还不能访问的地址。

5. 验收 HTTPS​

curl -I http://api.example.com/login
curl -I https://api.example.com/login
curl -I https://api.example.com/static/css/common.css
curl -I https://api.example.com/docs

预期结果:HTTP 请求跳转到 HTTPS;HTTPS 页面和静态资源返回 200 或项目正常的业务状态码。

浏览器还要检查:

  • 地址栏显示锁形图标;
  • 证书域名包含当前域名;
  • 没有“连接不安全”警告;
  • 页面 CSS、JavaScript 和图片没有因为混合内容被拦截。

6. 常见错误排查​

现象常见原因处理顺序
申请证书失败DNS 未生效、域名填错、80 被拦截nslookup → 安全组 → 宝塔域名
HTTPS 无法连接443 未开放或 Nginx 未重载安全组 → 宝塔 SSL → Nginx
证书域名不匹配访问的域名不在证书中重新申请包含该域名的证书
502 Bad GatewayNginx 到 FastAPI 失败docker compose ps → 本机 8000 → 日志
页面有锁但 CSS 失败静态资源仍写死 http://改为相对路径或 HTTPS URL
浏览器提示过期证书未自动续期检查宝塔计划任务和证书状态

7. 自动续期是生产必做项​

证书不是永久有效的。申请成功后进入宝塔的计划任务或 SSL 页面,确认存在续期任务。续期后 Nginx 需要重新加载证书,宝塔通常会自动处理。

不要等证书过期才检查。建议把证书到期时间写入生产运维记录,并在到期前至少两周人工访问一次 HTTPS 地址。

8. 端口最终状态​

端口作用状态
22SSH 管理按需开放并限制来源
80HTTP 验证和跳转开放
443HTTPS 公网入口开放
8000FastAPI 内部端口不开放
3306宝塔 MySQL不开放公网

9. 一分钟自测​

问题:证书应该安装在哪里?

  • A. 宝塔 Nginx 网站配置
  • B. 必须复制进 FastAPI Docker 镜像
  • C. 宝塔 MySQL 数据库

答案:A。Nginx 是公网入口,负责 TLS;FastAPI 继续处理内部 HTTP 请求即可。

本课通关证据​

nslookup api.example.com
curl -I http://api.example.com/login
curl -I https://api.example.com/login
curl -I https://api.example.com/static/css/common.css

保存证书有效期、HTTP 跳转结果、HTTPS 页面截图和自动续期设置截图。不要提交证书私钥、宝塔密码、Token 或 Cookie。

完成后进入第 18 课:生产安全加固。遇到证书错误时,请贴域名、状态码和完整错误输出,但隐藏敏感信息。

课程推荐

想系统学习这门课程?

你已阅读完本文。需要更完整的知识体系,可以继续了解「Vibe Coding 实战课程」。

查看课程详情