Apache+mod_wsgi环境下Flask应用新模块安装失效问题排查
我来帮你排查几个最可能的原因,一步步解决问题:
1. 模块没装到指定的虚拟环境里
很多时候是因为你安装模块时,没激活虚拟环境,导致模块被装到了系统全局的Python环境里,而不是你给Flask应用配置的/var/www/example/env虚拟环境中。
解决方法:
- 先激活虚拟环境:
source /var/www/example/env/bin/activate - 再安装新模块:
pip install 你的新模块 - 或者直接用虚拟环境的pip路径安装(不用激活):
/var/www/example/env/bin/pip install 你的新模块
2. Apache的mod_wsgi配置有误
看你给出的虚拟主机配置,WSGIPythonHome的路径设置错了!这个指令应该指向虚拟环境的根目录,而不是bin目录下的python可执行文件。
你当前的配置是:
WSGIPythonHome /var/www/example/env/bin/python3.5
正确的配置应该改成:
WSGIPythonHome /var/www/example/env WSGIPythonPath /var/www/example/env/lib/python3.5/site-packages
修改完配置文件后,必须重启Apache服务让配置生效:sudo systemctl restart apache2(如果是Ubuntu/Debian系统)
或者sudo service apache2 restart(老版本系统)
3. 没重启Apache服务
就算你正确安装了模块,Apache的进程还是会缓存之前的Python环境,不会自动加载新安装的模块。所以每次安装完新模块,都需要重启Apache,让mod_wsgi重新读取虚拟环境的site-packages目录。
4. 虚拟环境的权限问题
Apache运行时用的是www-data用户(默认),如果虚拟环境或者新安装的模块的权限设置不对,www-data用户没有读取权限,也会导致模块无法被加载。
检查权限的命令:ls -l /var/www/example/env/lib/python3.5/site-packages/你的新模块
如果权限不对,修复权限:sudo chown -R www-data:www-data /var/www/example/env
内容的提问来源于stack exchange,提问作者heapOverflow

