Docker端口映射与Nginx路由:从混乱到清晰

灵析和会议助手都跑在同一台ECS上,端口怎么分?Nginx怎么路由?记混端口、映射写错、容器内调不通——这篇帮你理清楚。

最终架构图

text
用户浏览器
    ↓ :80
宿主机 Nginx (lingxi-meeting.conf)
    ├─ /              → 127.0.0.1:8080  灵析前端
    ├─ /api/*         → 127.0.0.1:8000  灵析后端
    ├─ /meeting/      → 127.0.0.1:8081  会议前端
    ├─ /api/meeting/* → 127.0.0.1:8001  会议后端
    └─ /api/setting/* → 127.0.0.1:8001

端口映射规则

 
项目ECS宿主机端口容器内端口说明
灵析后端 8000 8000 uvicorn监听8000
灵析前端 8080 80 Nginx容器
会议后端 8001 8000 容器内8000,对外8001
会议前端 8081 80 Nginx容器

常见坑

坑1:映射写反了

会议助手compose写8001:8001,但容器内uvicorn监听的是8000 → health无响应。

正确写法:

yaml
ports:
  - "8001:8000"  # 宿主机8001 → 容器8000

坑2:容器内调API用错端口

容器内Nginx调后端API应该用backend:8000,不是8001——8001是宿主机端口,容器内不认。

nginx
# 容器内Nginx配置
location /api/ {
    proxy_pass http://backend:8000/api/;  # 不是8001
}

坑3:两个项目抢同一个端口

会议助手backend报错:

text
Bind for 0.0.0.0:8000 failed: port is already allocated

灵析backend已占8000,会议助手compose仍写8000:8000 → 改8001:8000

Nginx配置要点

nginx
# /etc/nginx/conf.d/lingxi-meeting.conf

# 灵析
location / {
    proxy_pass http://127.0.0.1:8080;
}

location /api/ {
    proxy_pass http://127.0.0.1:8000/api/;
}

# 会议助手(注意顺序:会议api在前,避免被灵析/api/拦截)
location /api/meeting/ {
    proxy_pass http://127.0.0.1:8001/api/meeting/;
}

location /api/setting/ {
    proxy_pass http://127.0.0.1:8001/api/setting/;
}

location /meeting/ {
    proxy_pass http://127.0.0.1:8081/;
}

踩坑总结

端口映射记住一个原则:宿主机的端口是什么,对外访问就用什么;容器内部调服务,用容器名和容器内端口。

posted @ 2026-06-26 17:01  竹雨禅月  阅读(6)  评论(0)    收藏  举报