如何将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
相关产品推荐
相关产品推荐

