Ubuntu18.04下Apache2无法加载Python3.8虚拟环境 调用Python3.6报错
问题根因
Ubuntu 18.04 apt源提供的libapache2-mod-wsgi-py3是针对系统默认Python3.6编译的。mod_wsgi没有跨Python大版本兼容能力,编译时绑定的Python版本必须和项目运行的Python版本完全一致,因此配置文件中指定的Python3.8虚拟环境不会生效,Apache始终调用Python3.6环境加载项目,自然无法识别虚拟环境内安装的Django、项目自身的业务模块。
另外原有虚拟主机配置的WSGIDaemonProcess参数中,python-path未加入项目根目录,即使Python版本匹配,也会出现找不到warehouse模块的问题。
解决步骤
- 卸载apt安装的不兼容mod_wsgi模块,避免版本冲突
sudo apt remove -y libapache2-mod-wsgi-py3
- 安装编译依赖,用于生成匹配Python3.8的mod_wsgi模块
sudo apt install -y apache2-dev python3.8-dev
- 进入项目目录,激活Python3.8虚拟环境,通过pip安装对应版本的mod_wsgi,该方式安装的模块会自动绑定当前虚拟环境的Python3.8版本
cd /home/tealy/warehouse source venv/bin/activate pip install mod-wsgi
- 执行命令获取mod_wsgi的Apache加载配置,将输出的内容完整记录
mod_wsgi-express module-config
输出示例:
LoadModule wsgi_module "/home/tealy/warehouse/venv/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so" WSGIPythonHome "/home/tealy/warehouse/venv"
- 写入模块加载配置,启用wsgi模块
# 将上一步输出的LoadModule行写入wsgi.load文件,注意替换成你自己实际执行输出的路径 echo "LoadModule wsgi_module \"/home/tealy/warehouse/venv/lib/python3.8/site-packages/mod_wsgi/server/mod_wsgi-py38.cpython-38-x86_64-linux-gnu.so\"" | sudo tee /etc/apache2/mods-available/wsgi.load sudo a2enmod wsgi
- 修改原有Apache虚拟主机配置,替换
WSGIDaemonProcess行,将项目根目录加入Python搜索路径,修正后的配置段参考:
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined Alias /static /home/tealy/warehouse/static <Directory /home/tealy/warehouse/static> Require all granted </Directory> <Directory /home/tealy/warehouse/warehouse> <Files wsgi.py> Require all granted </Files> </Directory> WSGIScriptAlias / /home/tealy/warehouse/warehouse/wsgi.py # 注意python-path最前面新增了项目根目录路径 WSGIDaemonProcess django_app python-path=/home/tealy/warehouse:/home/tealy/warehouse/venv/lib/python3.8/site-packages python-home=/home/tealy/warehouse/venv WSGIProcessGroup django_app </VirtualHost>
- 校验Apache配置语法,确认无误后重启服务
sudo apache2ctl configtest # 输出Syntax OK即可执行重启 sudo systemctl restart apache2
验证
重启后查看Apache运行日志,启动信息中会显示mod_wsgi/xxx Python/3.8 configured,此时访问站点即可正常加载Django应用,不会再出现模块找不到的报错。
注意:后续如果更换项目使用的Python大版本,必须重新编译安装对应版本的mod_wsgi,否则会再次出现版本不匹配问题。
内容的提问来源于stack exchange,提问作者tealy
相关产品推荐
相关产品推荐

