问题1
Nginx 配置导致 FastAPI 接口和验证码请求失败
问题描述
现象:在代理模式(
APP_IS_PROXY = true
)下,前端 Dash 应用的/getInfo
和/captchaImage
接口失败,后端日志显示收到/prod-api/prod-api/getInfo
和/prod-api/prod-api/captchaImage
,返回 404。前端日志显示“请求异常”。正常情况:设置
APP_IS_PROXY = false
,前端直接请求127.0.0.1:9099
,接口和验证码正常。问题图片:
问题原因
- 路径重复:
- 应用配置:
APP_IS_PROXY = true
,APP_PROXY_PATH = '/prod-api'
,前端请求http://dfa.mxdx.com/prod-api/getInfo
。 - FastAPI 期望
/prod-api/getInfo
或/prod-api/captchaImage
,但收到/prod-api/prod-api/getInfo
。 - 原因:前端可能重复添加
/prod-api
,Nginx 的rewrite
因未知原因不剥离一层前缀。 - 例子:前端请求
/prod-api/prod-api/getInfo
→ Nginx 转发/prod-api/getInfo
→ FastAPI 404。
- 应用配置:
- Nginx 配置问题:
- 原配置用
/api/
和端口8000
,不匹配APP_PROXY_PATH = '/prod-api'
和APP_BASE_URL = '127.0.0.1:9099'
。 rewrite
规则未能处理双重/prod-api
。
- 原配置用
- 非代理模式正常:
APP_IS_PROXY = false
时,前端直接请求127.0.0.1:9099/prod-api/getInfo
,路径正确。
核心原因:前端重复添加 /prod-api
,Nginx 未完全剥离,导致 FastAPI 收到错误路径(如 /prod-api/getInfo
)。
解决方案
关闭代理模式:
- 设置:
APP_IS_PROXY = false
- 效果:前端直接请求
127.0.0.1:9099/prod-api/getInfo
,绕过 Nginx,接口和验证码正常。 - 例子:请求
http://127.0.0.1:9099/prod-api/captchaImage
→ FastAPI 返回 200。 - 缺点:不适合生产环境,暴露后端端口。
- 设置:
修改代理路径:
设置:
APP_PROXY_PATH = '/'
或者置空效果:前端请求
http://dfa.mxdx.com/prod-api/getInfo
,Nginx 直接转发到127.0.0.1:9099/prod-api/getInfo
,无需剥离前缀。例子:请求
http://dfa.mxdx.com/prod-api/captchaImage
→ FastAPI 日志GET /captchaImage HTTP/1.1 200 OK
成功图片: