Apache+mod_wsgi-py3部署Flask遇ModuleNotFoundError问题求助
解决mod_wsgi无法找到虚拟环境中Flask模块的问题
我之前也碰到过几乎一模一样的坑,咱们一步步来排查解决:
1. 确认mod_wsgi的Python版本与虚拟环境匹配
首先要确保你安装的libapache2-mod-wsgi-py3和虚拟环境的Python版本一致,这是最常见的版本不匹配问题:
- 运行命令:
mod_wsgi-express module-config - 查看输出里的
LoadModule路径,比如如果输出是LoadModule wsgi_module "/usr/lib/apache2/modules/mod_wsgi-py36.so",说明是Python3.6的mod_wsgi,和你的虚拟环境版本匹配;如果是其他版本(比如3.7),那你需要重新安装对应版本的mod_wsgi,或者调整虚拟环境到匹配的Python版本。
2. 修正WSGIDaemonProcess的配置格式
你的配置里有个关键错误:WSGIDaemonProcess的第一个参数应该是进程名称,而不是路径!正确的配置应该是这样:
# 给进程起个自定义名称,比如appsummarization WSGIDaemonProcess appsummarization python-path=/var/www/html/textsummarization:/var/www/html/venv3.6/lib/python3.6/site-packages # 指定使用上面定义的进程组 WSGIScriptAlias /app3 /var/www/html/textsummarization/app.wsgi process-group=appsummarization <Directory /var/www/html/textsummarization/> Order allow,deny Allow from all </Directory>
原来的写法把/app3作为进程名,会导致mod_wsgi无法正确识别虚拟环境的路径配置。
3. 确保Apache用户有权限访问虚拟环境
Apache默认以www-data用户运行,要确保这个用户能读取虚拟环境的site-packages目录:
- 运行命令检查权限:
ls -ld /var/www/html/venv3.6/lib/python3.6/site-packages/ - 如果权限不足,执行:
sudo chown -R www-data:www-data /var/www/html/venv3.6/(或者至少开放读权限:sudo chmod -R 755 /var/www/html/venv3.6/)
4. 在app.wsgi中手动激活虚拟环境
如果上面的配置还是不行,可以直接在WSGI脚本里强制激活虚拟环境,这是最稳妥的兜底方案:
修改/var/www/html/textsummarization/app.wsgi内容为:
# 激活虚拟环境 activate_this = '/var/www/html/venv3.6/bin/activate_this.py' with open(activate_this) as file_: exec(file_.read(), dict(__file__=activate_this)) # 添加项目目录到Python路径 import sys sys.path.insert(0, '/var/www/html/textsummarization') # 导入Flask应用 from app import app as application
5. 重启Apache并验证
每次修改配置或脚本后,一定要重启Apache生效:
sudo systemctl restart apache2
然后访问你的应用,如果还是出错,查看Apache错误日志:tail -f /var/log/apache2/error.log,根据新的错误信息进一步排查。
内容的提问来源于stack exchange,提问作者user2129623
相关产品推荐
相关产品推荐

