如何在同一服务器的同一个子域名下部署两个Flask应用
实现方案
你可以根据使用场景选择以下两种方案:
方案1:子目录路径匹配(推荐,对外仅暴露1个端口)
这种方案符合你给出的sub.domain.com/1、sub.domain.com/2的示例,对外不用暴露额外端口,更适合生产环境。
- 新增Nginx反向代理服务,可以直接用Docker部署Nginx容器,也可以直接在宿主机安装Nginx,确保Nginx可以访问到两个Flask容器的服务端口。
- 提前适配两个Flask应用的路径配置:分别给两个应用设置
APPLICATION_ROOT参数,第一个设为/1,第二个设为/2,避免路由跳转、静态资源加载时出现路径错误。 - 新增Nginx站点配置,示例如下:
server { listen 80; server_name sub.domain.com; # 转发第一个Flask应用的请求 location /1/ { # 末尾的斜杠不能省略,会自动去除路径中的/1前缀再转发给应用 proxy_pass http://flask1容器名或内网IP:5000/; 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; } # 转发第二个Flask应用的请求 location /2/ { proxy_pass http://flask2容器名或内网IP:5000/; 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; } }
- 调整Docker网络配置:把Nginx容器和两个Flask容器加入同一个自定义Docker网桥,不需要合并两个应用的docker-compose配置,只要网络互通即可。
方案2:不同端口暴露(配置简单,适合内部测试场景)
不需要额外部署反向代理,配置门槛更低。
- 分别修改两个Flask应用的docker-compose.yml,将容器的服务端口映射到宿主机的不同公网端口,比如第一个应用配置
ports: 8001:5000,第二个应用配置ports: 8002:5000。 - 放开服务器防火墙的8001、8002端口公网访问权限,访问时直接使用
sub.domain.com:8001、sub.domain.com:8002即可。
注意事项
- 用子目录方案时,Flask应用内部的路由、静态资源引用优先用
url_for()函数生成,会自动拼接你配置的APPLICATION_ROOT前缀,避免出现404问题。 - 生产环境建议给Nginx配置HTTPS证书,两个应用可以共用同一个子域名的证书。
内容的提问来源于stack exchange,提问作者Viktor Andriichuk
相关产品推荐
相关产品推荐

