第 16 课:用宝塔 Nginx 和域名接入真实项目
第五阶段 · 正式生产环境 · 面向 Docker 初学者
本课完成标准
你能够解释域名、Nginx、反向代理和端口;把域名 A 记录指向 ECS;在宝塔配置反向代理;通过域名访问 student-management-api;排查 404、502、DNS 和端口问题;让 FastAPI 的 8000 端口不直接暴露公网。
1. 请求链路
| 名词 | 小白理解 | 本项目角色 |
|---|---|---|
| 域名 | 方便记忆的地址,如 api.example.com | 浏览器入口 |
| Nginx | 站在门口的“前台” | 接收 80 并转交 FastAPI |
| 反向代理 | 前台替内部服务接待请求 | 转发到 8000 |
| FastAPI | 处理业务的“后厨” | 返回页面、接口和静态资源 |
请求链路:浏览器 → 域名 → 宝塔 Nginx(80)→ FastAPI 容器(127.0.0.1:8000)。
关键原则:用户只访问 80;Nginx 在服务器内部访问 8000,不让陌生人直接访问 FastAPI。
2. 准备域名
以下用 api.example.com 作示例,请替换成自己的域名。
- 在阿里云 DNS 添加 A 记录。
- 主机记录填写
api,记录值填写 ECS 公网 IP。 - 等待 DNS 生效。
nslookup api.example.com
结果出现 ECS 公网 IP,说明解析方向正确。参考阿里云 DNS 添加记录。
不要把域名写成容器名:域名解析到服务器公网 IP;Nginx 到 FastAPI 的目标才是 127.0.0.1:8000。
3. 在宝塔添加反向代理
- 宝塔 → 网站 → 添加站点,域名填写
api.example.com。 - PHP 版本选择“纯静态”或按面板提示创建。
- 进入网站 设置 → 反向代理,新增代理。
- 代理名称填写
student-api,目标 URL 填http://127.0.0.1:8000。 - 保存并重载 Nginx。
宝塔是在帮你生成 Nginx 配置。可参考 Nginx 官方 proxy 文档。
4. 确认 Docker 只监听本机
cd /www/wwwroot/student-management-api
docker compose ps
curl -I http://127.0.0.1:8000/login
Compose 推荐:
ports:
- "127.0.0.1:8000:8000"
不要使用 0.0.0.0:8000:8000,它会让 8000 暴露公网。若当前是 8000:8000,先确认 Nginx 和域名成功,再关闭公网 8000,并调整安全组。
5. 用域名验收
curl -I http://api.example.com/login
curl -I http://api.example.com/static/css/common.css
curl -I http://api.example.com/docs
| 状态 | 含义 | 先检查 |
|---|---|---|
| 200 | Nginx 和 FastAPI 已连通 | 页面和静态资源 |
| 301/302 | 存在跳转 | 网站设置和 URL |
| 404 | 路径或站点配置错误 | 域名、路由、静态目录 |
| 502 | Nginx 找不到后端 | 容器、8000、日志 |
| 无法连接 | DNS、80 或安全组问题 | nslookup、安全组、Nginx |
6. 502 固定排查顺序
docker compose ps
curl -I http://127.0.0.1:8000/login
docker compose logs --tail=100 api
如果本机访问失败,问题在 Docker、FastAPI 或数据库,不在域名;如果本机成功但域名 502,重点检查宝塔代理目标和 Nginx 配置。
7. 端口和安全组
| 端口 | 用途 | 公网 |
|---|---|---|
| 22 | SSH 管理 | 按需开放 |
| 80 | HTTP → Nginx | 开放 |
| 443 | HTTPS,下一课配置 | 下一课开放 |
| 8000 | FastAPI 内部端口 | 不开放 |
| 3306 | 宝塔 MySQL | 不开放 |
8. 一分钟自测
Nginx 反向代理目标应该填哪个?
- A.
http://127.0.0.1:8000 - B.
http://api.example.com:8000 - C. 宝塔 MySQL 的 3306 端口
答案:A。Nginx 和 FastAPI 在同一台 ECS 上,后端目标是本机 8000。
本课通关证据
nslookup api.example.com
docker compose ps
curl -I http://127.0.0.1:8000/login
curl -I http://api.example.com/login
curl -I http://api.example.com/static/css/common.css
保存域名解析结果、宝塔反向代理截图、curl 响应和容器日志。不要上传密码、Token、私钥或 Cookie。
完成后进入第 17 课:用宝塔启用 HTTPS。遇到错误时,请贴操作系统、完整命令和错误输出,但隐藏密码、Token 与私钥。
想系统学习这门课程?
你已阅读完本文。需要更完整的知识体系,可以继续了解「Vibe Coding 实战课程」。
查看课程详情