Nginx配置Flask站点在子目录而非根目录运行的问题
解决Flask站点在Nginx+uWSGI下子目录运行的404问题
我之前也遇到过完全一样的问题——想让Flask站点跑在Nginx的子目录下,改了location之后直接404,其实光改Nginx是不够的,得同步调整Flask和uWSGI的配置,下面一步步来解决:
步骤1:修改Nginx配置
你之前只改了location的路径,但没告诉Flask它的根路径前缀,也没处理请求路径的转发逻辑。更新你的/etc/nginx/sites-available/myproject配置:
server { server_name mydomain www.mydomain; # 注意路径末尾带斜杠,匹配所有/myproject下的子路径 location /myproject/ { include uwsgi_params; # 关键:告诉Flask应用的脚本路径前缀 uwsgi_param SCRIPT_NAME /myproject; uwsgi_pass unix:/root/Desktop/myproject/myproject.sock; # 让uWSGI自动去掉请求路径中的/myproject前缀,传给Flask的是干净的路径 uwsgi_modifier1 30; } listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/mydomain/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/mydomain/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot } server { if ($host = www.mydomain) { return 301 https://$host$request_uri; } # managed by Certbot if ($host = mydomain) { return 301 https://$host$request_uri; } # managed by Certbot listen 80; server_name mydomain www.mydomain; return 404; # managed by Certbot }
步骤2:调整Flask应用的路由前缀
有两种简单的方法让Flask识别子目录前缀:
方法一:设置APPLICATION_ROOT(推荐)
在你的Flask应用代码里,初始化app时加上APPLICATION_ROOT配置:
from flask import Flask app = Flask(__name__) # 告诉Flask它的根路径是/myproject app.config['APPLICATION_ROOT'] = '/myproject' # 可选:关闭严格斜杠检查,避免/myproject和/myproject/的路由冲突 app.url_map.strict_slashes = False # 你的路由定义 @app.route('/') def index(): return "Hello from /myproject!"
这样url_for生成的链接也会自动带上/myproject前缀,不会出错。
方法二:用Blueprint统一挂载前缀
如果不想修改全局app的配置,可以把所有路由注册到一个Blueprint上,指定前缀:
from flask import Flask, Blueprint # 创建Blueprint,指定url前缀为/myproject main_bp = Blueprint('main', __name__, url_prefix='/myproject') # 所有路由都注册到这个Blueprint上 @main_bp.route('/') def index(): return "Hello from /myproject!" @main_bp.route('/about') def about(): return "About page under /myproject" # 初始化app并注册Blueprint app = Flask(__name__) app.register_blueprint(main_bp)
步骤3:更新uWSGI配置
修改你的config.ini,加上manage-script-name选项,确保uWSGI正确处理Nginx传来的SCRIPT_NAME参数:
[uwsgi] module = server:app master = true processes = 5 socket = myproject.sock chmod-socket = 660 vacuum = true die-on-term = true # 启用脚本名称管理,配合Nginx的配置 manage-script-name = true route-run = fixpathinfo:
最后重启服务测试
修改完所有配置后,重启Nginx和uWSGI让配置生效:
# 重启Nginx sudo systemctl restart nginx # 重启uWSGI(如果用systemd管理的话,假设服务名为uwsgi@myproject) sudo systemctl restart uwsgi@myproject # 如果没有systemd服务,直接用uWSGI命令重启(先停止再启动) uwsgi --stop myproject.pid uwsgi --ini config.ini
现在访问https://mydomain/myproject应该就能正常加载你的Flask站点了,不会再出现404错误。
内容的提问来源于stack exchange,提问作者FreeMind
相关产品推荐
相关产品推荐

