Django通过Apache+wsgi部署时连接MariaDB 5.5.68出现_mysql未定义报错
问题成因
- mod_wsgi版本不匹配:本地开发使用Python3.9,但Apache加载的系统默认mod_wsgi通常对应系统预装的Python版本(多数是Python2或低版本Python3),无法正确加载Python3.9虚拟环境里的依赖包,导致mysqlclient的底层
_mysql扩展模块无法识别。 - wsgi.py配置错误:手动添加了大量冗余且有语法错误的路径:虚拟环境路径存在换行断裂,且单独把MySQLdb目录加入sys.path反而会干扰模块的正常导入逻辑,导致
_mysql扩展找不到。 - 权限不足:虚拟环境放在用户home目录下,Apache运行用户(通常是apache、www-data)默认没有home目录的读取权限,无法加载虚拟环境内的依赖文件。
- mysqlclient编译不完整:安装mysqlclient时系统缺少MariaDB对应开发依赖,导致编译时没有生成
_mysql底层扩展模块,只有上层Python封装代码。
解决方案
1. 修正wsgi.py配置
删掉所有冗余的sys.path配置,使用正确的虚拟环境激活逻辑,参考配置如下:
import os import sys # 替换为你的项目根目录路径 PROJECT_DIR = '/var/www/trackx_proj/trackx_root' # 替换为你的虚拟环境根目录路径 VENV_DIR = '/home/bakert/.local/share/virtualenvs/trackx_proj_master-nygxcPTP' sys.path.insert(0, PROJECT_DIR) sys.path.insert(0, f"{VENV_DIR}/lib/python3.9/site-packages") # 激活虚拟环境 activate_this = f"{VENV_DIR}/bin/activate_this.py" with open(activate_this) as f: exec(f.read(), {'__file__': activate_this}) os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'trackx.settings') from django.core.wsgi import get_wsgi_application application = get_wsgi_application()
注意:不要在路径中间加换行,确保虚拟环境路径是完整连续的字符串。
2. 修复mod_wsgi版本匹配
卸载系统源安装的mod_wsgi,使用虚拟环境内的mod_wsgi配置Apache:
- 先在虚拟环境内执行
pip install mod_wsgi,确保编译对应Python3.9的版本 - 执行
mod_wsgi-express module-config,将输出的配置写入Apache的mods-available/wsgi.load文件,替换原有mod_wsgi加载配置 - 重启Apache服务
3. 修复权限问题
建议将虚拟环境迁移到/var/www目录下,避免home目录权限限制,执行如下命令:
mv /home/bakert/.local/share/virtualenvs/trackx_proj_master-nygxcPTP /var/www/venv_trackx
然后给Apache用户授予目录权限:
# CentOS/RHEL 系 chown -R apache:apache /var/www/trackx_proj /var/www/venv_trackx # Debian/Ubuntu 系 chown -R www-data:www-data /var/www/trackx_proj /var/www/venv_trackx
同时将wsgi.py内的虚拟环境路径更新为新的/var/www/venv_trackx。
4. 重新编译mysqlclient
先安装系统级MariaDB开发依赖:
# CentOS/RHEL 系 yum install -y mariadb-devel gcc python39-devel # Debian/Ubuntu 系 apt install -y libmariadb-dev gcc python3.9-dev
然后激活虚拟环境,重装mysqlclient:
pip uninstall -y mysqlclient pip install mysqlclient==2.0.1
5. 补充Apache虚拟主机配置(可选,更稳定)
在Apache的站点配置中指定WSGI进程的Python路径,不需要在wsgi.py内手动处理路径,参考配置:
<VirtualHost *:80> ServerName 你的站点域名 WSGIDaemonProcess trackx python-path=/var/www/trackx_proj/trackx_root:/var/www/venv_trackx/lib/python3.9/site-packages WSGIProcessGroup trackx WSGIScriptAlias / /var/www/trackx_proj/trackx_root/trackx/wsgi.py <Directory /var/www/trackx_proj/trackx_root/trackx> <Files wsgi.py> Require all granted </Files> </Directory> # 静态文件、媒体文件配置省略 </VirtualHost>
内容的提问来源于stack exchange,提问作者Todd B
相关产品推荐
相关产品推荐

