如何解决Flask应用通过Apache+mod_wsgi部署后404错误?
解决mod_wsgi + Apache部署Flask应用的404问题
一、修正main.py代码
你的main.py中保留了Flask开发服务器启动代码,这会与mod_wsgi运行模式冲突,必须移除:
from app import create_app application = create_app() # 移除该行:application.run(debug=True)
二、修正Apache虚拟主机配置(website.conf)
替换原有配置为以下内容,解决路由关联、权限和Python路径问题:
<VirtualHost *:80> ServerName example.com ServerAlias www.example.com ServerAdmin email@email.com # 绑定WSGI脚本入口 WSGIScriptAlias / /var/www/appDirectory/app/api/main.py # 定义独立daemon进程,添加项目根目录到Python路径 WSGIDaemonProcess flask-app python-path=/var/www/appDirectory:/var/www/appDirectory/venv/lib/python3.10/site-packages user=www-data group=www-data # 指定使用上述daemon进程处理请求 WSGIProcessGroup flask-app # 配置项目目录权限(指向目录而非文件) <Directory /var/www/appDirectory/app/api> Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
关键修正点:
- 给
WSGIDaemonProcess命名并通过WSGIProcessGroup关联,确保请求使用虚拟环境的Python解释器 python-path添加项目根目录,让mod_wsgi能找到app模块Directory配置指向目录而非文件,权限规则生效- 移除多余的
Alias /api配置,避免干扰Flask路由
三、修复mod_wsgi模块冲突
你同时安装了系统包libapache2-mod-wsgi-py3和虚拟环境内的mod_wsgi,会导致模块冲突:
- 禁用系统版本mod_wsgi:
sudo a2dismod wsgi
- 确保
/etc/apache2/mods-enabled/wsgi.load仅保留虚拟环境的mod_wsgi配置:
LoadModule wsgi_module "/home/user/appDirectory/venv/lib/python3.10/site-packages/mod_wsgi/server/mod_wsgi-py310.cpython-310-x86_64-linux-gnu.so" WSGIPythonHome "/home/user/appDirectory/venv"
四、重启Apache服务
sudo systemctl restart apache2
完成以上步骤后,重新访问example.com/endpoint即可正常响应。
内容的提问来源于stack exchange,提问作者Joel Gray
相关产品推荐
相关产品推荐

