You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker-Compose多容器Flask+Nginx反向代理404问题排查

排查反向代理下Flask返回404的问题

从你的描述和日志来看,直接访问Flask容器端口正常,但通过nginx-proxy访问时返回404,核心问题出在Flask的Host头匹配或者容器网络配置上,下面一步步分析解决:

1. 先确认容器网络连通性(关键前提)

你的nginx-proxy使用的是名为proxy的网络,而Flask应用连接的是外部网络nginx_proxy——这两个是完全独立的Docker网络!正常情况下nginx-proxy根本无法直接访问Flask容器,除非你手动把nginx-proxy加入了nginx_proxy网络,或者nginx-proxy是通过宿主机的端口映射访问Flask的(这种方式会导致Host头不匹配)。

解决办法:

  • 修改nginx-proxy的docker-compose.yml,将网络改为nginx_proxy并设置为外部网络:
    version: "3.5"
    services:
      nginx-proxy:
        image: jwilder/nginx-proxy
        ports:
          - 80:80
        volumes:
          - /var/run/docker.sock:/tmp/docker.sock:ro
        networks:
          - nginx_proxy
    networks:
      nginx_proxy:
        external: true
    
  • 重启nginx-proxy容器,确保它和Flask容器处于同一个网络中,这样nginx-proxy可以直接通过容器名访问Flask,而不需要走宿主机端口。

2. 检查Flask的SERVER_NAME配置(最常见的404原因)

从日志来看,直接访问(Host为0.0.0.0:5000)返回200,代理访问(Host为app.local)返回404,大概率是你的Flask应用设置了SERVER_NAME参数,比如:

app.config['SERVER_NAME'] = '0.0.0.0:5000'

当Flask设置了SERVER_NAME,它会验证每个请求的Host头是否匹配该值,不匹配的请求就会返回404。

解决办法:

  • 移除SERVER_NAME配置:如果不需要生成带域名的URL,直接删掉这一行即可,Flask会自动处理任意Host的请求。
  • 或者修改SERVER_NAME为你的代理域名:
    app.config['SERVER_NAME'] = 'app.local'
    
  • 如果你的应用需要支持多个Host,可以设置APPLICATION_ROOT并确保路由不依赖Host头:
    app.config['APPLICATION_ROOT'] = '/staging/data'
    

3. 验证nginx-proxy的Host头转发

jwilder/nginx-proxy默认会根据VIRTUAL_HOST环境变量设置正确的Host头转发,但你可以手动确认:

  • 进入nginx-proxy容器:docker exec -it <nginx-proxy-container-name> bash
  • 查看自动生成的配置文件:cat /etc/nginx/conf.d/default.conf
  • 确认对应的server块中存在proxy_set_header Host $host;,这样请求的Host头会正确传递给Flask容器。

4. 检查Flask路由的Host限制

如果你的Flask路由显式指定了host参数,比如:

@app.route('/staging/data/', host='0.0.0.0:5000')
def get_data():
    # ...

那么只有Host为0.0.0.0:5000的请求才会匹配,代理过来的app.local请求就会返回404。解决办法是移除路由中的host参数,或者添加app.local作为允许的Host:

@app.route('/staging/data/', host=['0.0.0.0:5000', 'app.local'])
def get_data():
    # ...

按照上面的步骤排查,应该能解决你的404问题。

内容的提问来源于stack exchange,提问作者rll

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:01:17