使用Apache2与mod_wsgi部署Flask应用:根路径与子路径冲突问题
解决Flask应用在Apache根路径与子路径共存的部署问题
这个问题我之前碰到过,本质是Apache的WSGIScriptAlias前缀匹配优先级导致的——当你把第一个应用设为WSGIScriptAlias /时,所有请求(包括/menus)都会被优先转发给根路径的Flask应用,而你的第一个应用里没有/menus对应的路由,自然就返回404了。
要解决这个冲突,我们需要调整根路径应用的匹配规则,让它只处理/或者除了/menus之外的请求,同时保证/menus的请求能正确路由到第二个应用。下面是两种可行的配置方案:
方案一:精确匹配根路径(仅localhost/由第一个应用处理)
如果你的第一个应用只需要响应根路径的访问,不需要处理根路径下的其他子路由,那么可以用WSGIScriptAliasMatch做精确匹配:
<VirtualHost *:80> ServerName localhost # logs configuration ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # 先配置menus应用(顺序不影响,但放在前面更清晰) WSGIDaemonProcess menus user=#1000 group=#1000 threads=5 WSGIScriptAlias /menus /var/www/flask_ac/projects/menus/hookup.wsgi <Directory "/var/www/flask_ac/projects/menus/"> WSGIProcessGroup menus WSGIApplicationGroup menus Require all granted </Directory> # 配置根路径应用:仅匹配精确的/路径 WSGIDaemonProcess flask_ac user=#1000 group=#1000 threads=5 WSGIScriptAliasMatch ^/$ /var/www/flask_ac/hookup.wsgi <Directory /var/www/flask_ac> WSGIProcessGroup flask_ac WSGIApplicationGroup flask_ac Require all granted </Directory> </VirtualHost>
方案二:排除/menus路径(根路径下其他子路由也由第一个应用处理)
如果你的第一个应用需要处理根路径下的其他子路由(比如/about、/contact),但要排除/menus,可以用正则匹配来过滤路径:
<VirtualHost *:80> ServerName localhost # logs configuration ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined # 先配置menus应用 WSGIDaemonProcess menus user=#1000 group=#1000 threads=5 WSGIScriptAlias /menus /var/www/flask_ac/projects/menus/hookup.wsgi <Directory "/var/www/flask_ac/projects/menus/"> WSGIProcessGroup menus WSGIApplicationGroup menus Require all granted </Directory> # 配置根路径应用:匹配所有不以/menus开头的路径 WSGIDaemonProcess flask_ac user=#1000 group=#1000 threads=5 WSGIScriptAliasMatch ^/(?!menus)(.*)$ /var/www/flask_ac/hookup.wsgi/$1 <Directory /var/www/flask_ac> WSGIProcessGroup flask_ac WSGIApplicationGroup flask_ac Require all granted </Directory> </VirtualHost>
配置完成后的操作
- 保存修改后的Apache配置文件
- 重启Apache服务(命令:
sudo systemctl restart apache2,根据你的系统可能略有不同) - 测试访问:
- 访问
localhost:应该正常显示第一个Flask应用 - 访问
localhost/menus:应该正常显示第二个Flask应用
- 访问
额外注意事项
- 确保两个Flask应用的
hookup.wsgi脚本配置正确,比如都正确导入了Flask实例(通常是from app import app as application) - 检查Apache用户对
/var/www/flask_ac及其子目录的访问权限,避免因权限问题导致无法加载应用
内容的提问来源于stack exchange,提问作者Aubrey Wiedeman
相关产品推荐
相关产品推荐

