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

如何将Flower的5556端口映射到FastAPI的端点?

将Flower仪表盘映射到FastAPI端点的两种方案

方案一:通过FastAPI内置反向代理实现

无需额外服务,直接在FastAPI应用中添加代理逻辑,将/flower-dashboard路径转发到Flower服务。

步骤1:修改docker-compose.yml中的dashboard服务

移除宿主机端口映射,添加Flower的路径前缀参数:

dashboard:
  build: ./project
  command: flower --app=worker.celery --port=5555 --broker=redis://:password@redis:6379/0 --url_prefix=/flower-dashboard
  environment:
    - CELERY_BROKER_URL=redis://:password@redis:6379/0
    - CELERY_RESULT_BACKEND=redis://:password@redis:6379/0
  depends_on:
    - web
    - redis

步骤2:修改FastAPI的main.py文件

先安装依赖:pip install httpx,再添加反向代理中间件:

from fastapi import FastAPI, Response
import httpx

app = FastAPI()

# 反向代理Flower仪表盘
@app.middleware("http")
async def proxy_flower(request, call_next):
    if request.url.path.startswith("/flower-dashboard"):
        target_url = f"http://dashboard:5555{request.url.path}"
        async with httpx.AsyncClient() as client:
            response = await client.request(
                method=request.method,
                url=target_url,
                headers={k: v for k, v in request.headers.items() if k != "Host"},
                content=await request.body(),
                cookies=request.cookies,
                follow_redirects=True,
            )
            return Response(
                content=response.content,
                status_code=response.status_code,
                headers=dict(response.headers),
                media_type=response.headers.get("content-type"),
            )
    return await call_next(request)

# 原有路由示例
@app.get("/")
async def root():
    return {"message": "FastAPI + Celery + Flower"}

方案二:用Nginx做反向代理(推荐生产环境)

通过Nginx统一转发请求,将根路径指向FastAPI,/flower-dashboard指向Flower服务,性能更优且支持WebSocket(Flower实时监控依赖WebSocket)。

步骤1:更新docker-compose.yml

添加Nginx服务,调整web和dashboard服务的端口配置:

version: '3.8'

services:

  web:
    build: ./project
    command: uvicorn main:app --host 0.0.0.0 --reload
    volumes:
      - ./project:/usr/src/app
    environment:
      - CELERY_BROKER_URL=redis://:password@redis:6379/0
      - CELERY_RESULT_BACKEND=redis://:password@redis:6379/0
    depends_on:
      - redis

  worker:
    build: ./project
    command: celery worker --app=worker.celery --loglevel=info --logfile=logs/celery.log
    volumes:
      - ./project:/usr/src/app
    environment:
      - CELERY_BROKER_URL=redis://:password@redis:6379/0
      - CELERY_RESULT_BACKEND=redis://:password@redis:6379/0
    depends_on:
      - web
      - redis

  redis:
    image: public.ecr.aws/ubuntu/redis:5.0-20.04_edge
    restart: always
    command: /bin/sh -c "redis-server --requirepass $$REDIS_HOST_PASSWORD"
    env_file:
      - redis.env

  dashboard:
    build: ./project
    command: flower --app=worker.celery --port=5555 --broker=redis://:password@redis:6379/0 --url_prefix=/flower-dashboard
    environment:
      - CELERY_BROKER_URL=redis://:password@redis:6379/0
      - CELERY_RESULT_BACKEND=redis://:password@redis:6379/0
    depends_on:
      - web
      - redis

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - web
      - dashboard

步骤2:创建nginx.conf配置文件

在项目根目录下创建nginx.conf,内容如下:

events {}

http {
    server {
        listen 80;

        # 转发FastAPI请求
        location / {
            proxy_pass http://web:80;
            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;
        }

        # 转发Flower仪表盘请求,支持WebSocket
        location /flower-dashboard {
            proxy_pass http://dashboard:5555;
            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;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
}

注意事项

  • 两种方案都必须给Flower添加--url_prefix=/flower-dashboard参数,否则Flower内部的静态资源路径会错误。
  • 方案一适合开发环境快速验证,方案二更适合生产环境,稳定性和性能更好。
  • 确保所有服务在同一个Docker网络中(默认docker-compose会创建专属网络,无需额外配置)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:15:13