Nginx反向代理Docker部署FastAPI如何免逐个配置端点
问题根因
配置不生效的核心是Nginx proxy_pass 的路径拼接规则:当proxy_pass后面的上游地址不带任何URI路径(即你当前写的http://api形式),Nginx会把客户端请求的完整原始路径直接透传给后端服务。
比如你请求http://localhost:3000/api/day?day_num=5时,Nginx转发给FastAPI的实际路径是/api/day,但你代码里注册的接口路径是/day,后端找不到对应路由自然报错。你之前单独写的location /api/day规则本质是手动做了路径替换,把/api/day映射到后端的/day,所以能通,但每个接口都写一遍规则维护成本极高。
通用解决方案
只需要修改nginx-setup.conf里的/api/匹配规则,在proxy_pass的上游地址末尾加一个斜杠/,就能自动剥离请求路径里的/api/前缀,不需要为每个端点单独写配置。
修改后的完整Nginx配置如下:
upstream api { server backend:8000; } server { listen 8080; location /api/ { # 注意末尾必须加/,会自动将请求路径中匹配到的/api/前缀替换为/ proxy_pass http://api/; proxy_set_header Host $http_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; } }
修改完成后直接删掉之前单独写的location /api/day规则即可,所有/api/*的请求都会自动按规则转发:
- 访问
http://localhost:3000/api/day?day_num=5→ 后端收到路径/day?day_num=5,匹配业务接口 - 访问
http://localhost:3000/api/docs→ 后端收到路径/docs,正常加载Swagger文档 - 访问
http://localhost:3000/api/openapi.json→ 后端收到路径/openapi.json,正常返回接口文档数据 - 后续新增任意FastAPI端点,都不需要修改Nginx配置,直接访问
/api/对应端点路径即可
配置校验说明
你docker-compose.yml里给uvicorn加的--root-path /api参数是正确的,这个参数会让FastAPI自动识别反向代理的路径前缀,自动处理文档内的接口路径、静态资源引用地址,不会出现文档打开后资源加载失败、接口请求404的问题。
改完Nginx配置后执行以下命令重启Nginx容器即可生效:docker compose restart nginx
内容的提问来源于stack exchange,提问作者cpage
相关产品推荐
相关产品推荐

