uWSGI搭配Nginx部署Flask/Dash应用访问子路径返回404问题求助
问题初步定位
从你提供的uWSGI服务日志可以确定,请求已经成功从Nginx转发到了uWSGI进程,404是你的Python应用返回的,并非Nginx抛出的默认404,所以排查方向集中在路由转发规则、应用配置两个方向。
具体排查步骤
1. 修正Nginx路径转发规则
你当前的/myproject/ location块未做路径重写,会把完整的/myproject/xxx路径直接传给后端应用,而你的应用默认路由是/,没有匹配/myproject/前缀的路由,自然返回404。你可以参考同配置下shiny、rstudio的重写规则,在location /myproject/块内添加重写规则:
location /myproject/ { rewrite ^/myproject/(.*)$ /$1 break; uwsgi_pass unix:/home/XXX/XXX/python_dash/myproject/myproject.sock; include uwsgi_params; }
2. 适配Dash应用的路径前缀
如果是部署Dash应用,仅做Nginx重写还不够,Dash的静态资源、回调路径默认基于根路径生成,你需要在Dash初始化时显式指定路径前缀:
app = Dash(__name__, url_base_pathname='/myproject/')
如果是部署纯Flask应用,且需要保留/myproject前缀,也可以通过注册蓝图、配置APPLICATION_ROOT参数实现。
3. 验证应用本身的路由配置
先在VPS本地绕过Nginx、uWSGI直接测试应用可用性,执行以下命令启动临时测试服务:uwsgi --http :8000 --module wsgi:app --chdir /home/XXX/XXX/python_dash/myproject
之后在VPS本地执行curl 127.0.0.1:8000,确认应用根路由可以正常返回内容,再执行curl 127.0.0.1:8000/myproject/,确认是否返回404,排查应用本身的路由配置问题。
4. 检查wsgi.py文件配置
如果是部署Dash应用,注意WSGI入口需要导出Dash实例的server属性(该属性才是符合WSGI规范的Flask实例),你的wsgi.py文件应该符合以下格式:
from your_dash_app_file import app # 此处的app是Dash实例 application = app.server
同时需要同步修改uWSGI配置文件myproject.ini的module参数为module = wsgi:application,如果直接导出Dash实例作为WSGI应用,会出现路由匹配异常。
5. 补充uWSGI配置避免路径异常
建议在myproject.ini中显式指定工作目录,避免相对路径导致的sock文件、模块加载异常:
[uwsgi] chdir = /home/XXX/XXX/python_dash/myproject module = wsgi:application master = true processes = 5 socket = myproject.sock chmod-socket = 666 vacuum = true die-on-term = true
内容的提问来源于stack exchange,提问作者Tomasz Wojtas

