第 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,并且验证服务可以访问服务器。
- 确认
api.example.com的 A 记录指向 ECS 公网 IP。 - 阿里云安全组开放 TCP 80 和 443。
- 宝塔面板中的网站名称与域名完全一致。
- 暂时不要让安全组拦截 80,因为证书机构可能用 HTTP 验证域名所有权。
可以先验证:
nslookup api.example.com
curl -I http://api.example.com/login
3. 在宝塔申请 Let’s Encrypt 证书
- 宝塔 → 网站 → 找到
api.example.com。 - 点击 设置 → SSL。
- 选择 Let’s Encrypt。
- 勾选当前域名,填写可接收通知的邮箱,点击申请。
- 申请成功后确认页面显示有效期和证书状态。
Let’s Encrypt 是常见的免费证书来源;也可以使用阿里云或其他 CA 签发的证书。不要把证书私钥提交到 GitHub。可参考 Let’s Encrypt 官方文档 和 Certbot 文档。
4. 开启 HTTPS 和自动跳转
在宝塔 SSL 页面:
- 确认“SSL 开关”已开启。
- 开启“强制 HTTPS”(有些版本叫“强制跳转 HTTPS”)。
- 保存并重载 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 Gateway | Nginx 到 FastAPI 失败 | docker compose ps → 本机 8000 → 日志 |
| 页面有锁但 CSS 失败 | 静态资源仍写死 http:// | 改为相对路径或 HTTPS URL |
| 浏览器提示过期 | 证书未自动续期 | 检查宝塔计划任务和证书状态 |
7. 自动续期是生产必做项
证书不是永久有效的。申请成功后进入宝塔的计划任务或 SSL 页面,确认存在续期任务。续期后 Nginx 需要重新加载证书,宝塔通常会自动处理。
不要等证书过期才检查。建议把证书到期时间写入生产运维记录,并在到期前至少两周人工访问一次 HTTPS 地址。
8. 端口最终状态
| 端口 | 作用 | 状态 |
|---|---|---|
| 22 | SSH 管理 | 按需开放并限制来源 |
| 80 | HTTP 验证和跳转 | 开放 |
| 443 | HTTPS 公网入口 | 开放 |
| 8000 | FastAPI 内部端口 | 不开放 |
| 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 实战课程」。
查看课程详情