Apache部署Django出现500错误:SQLite版本不匹配(加载lib64旧版本而非虚拟环境新版本)
你的核心问题很明确:Apache的WSGI进程加载了系统自带的旧版SQLite(3.7.17),而非虚拟环境里的3.36.0版本,导致Django触发版本要求的配置错误。下面是几个优先级从高到低的可行解决方案:
方法1:通过环境变量指定WSGI加载新版SQLite库
这是最快捷的方案,无需编译任何组件,只需修改Apache的WSGI配置:
先找到虚拟环境中新版SQLite的库文件目录:
source /home/rafiq/myprojectenv/bin/activate find $VIRTUAL_ENV -name "libsqlite3.so*"你会得到类似
/home/rafiq/myprojectenv/lib/libsqlite3.so.0.8.6的路径,记住这个根目录(比如/home/rafiq/myprojectenv/lib)。修改Apache配置文件
/etc/httpd/conf.d/django.conf,在WSGIDaemonProcess行末尾添加环境变量设置:WSGIDaemonProcess myproject python-path=/home/rafiq/myprojectenv:/home/rafiq/myprojectenv/lib/python3.7/site-packages environment=LD_LIBRARY_PATH=/home/rafiq/myprojectenv/lib这里的
LD_LIBRARY_PATH就是刚才找到的新版SQLite库所在目录。重启Apache服务生效:
sudo systemctl restart httpd
方法2:重新编译mod_wsgi绑定虚拟环境的Python
如果方法1无效,可能是系统自带的mod_wsgi和虚拟环境Python存在兼容性问题,这时需要重新安装绑定虚拟环境的mod_wsgi:
卸载系统自带的mod_wsgi:
sudo yum remove mod_wsgi激活虚拟环境,安装mod_wsgi:
source /home/rafiq/myprojectenv/bin/activate pip install mod_wsgi生成mod_wsgi的Apache配置指令:
mod_wsgi-express module-config你会得到类似下面的输出:
LoadModule wsgi_module "/home/rafiq/myprojectenv/lib/python3.7/site-packages/mod_wsgi/server/mod_wsgi-py37.cpython-37m-x86_64-linux-gnu.so" WSGIPythonHome "/home/rafiq/myprojectenv"将上述内容复制到Apache的模块配置文件(比如
/etc/httpd/conf.modules.d/10-wsgi.conf),替换原来的mod_wsgi加载指令。重启Apache:
sudo systemctl restart httpd
方法3:重新编译Python并静态链接新版SQLite
如果前两种方法都无效,说明你的Python是动态链接系统SQLite库的,这时需要重新编译Python,让它静态绑定新版SQLite:
下载并编译安装新版SQLite:
wget https://www.sqlite.org/2021/sqlite-autoconf-3360000.tar.gz tar zxf sqlite-autoconf-3360000.tar.gz cd sqlite-autoconf-3360000 ./configure --prefix=/usr/local/sqlite3 make && sudo make install下载Python 3.7.12源码,编译时指定SQLite路径:
wget https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz tar zxf Python-3.7.12.tgz cd Python-3.7.12 ./configure --prefix=/usr/local/python3.7 --with-sqlite3=/usr/local/sqlite3 make && sudo make install用新编译的Python重新创建虚拟环境:
/usr/local/python3.7/bin/python3 -m venv /home/rafiq/myprojectenv source /home/rafiq/myprojectenv/bin/activate pip install django重新配置Apache和WSGI指向新虚拟环境,然后重启Apache。
额外检查点
- 若Django的
settings.py中DEBUG设为False,确保ALLOWED_HOSTS包含了访问的IP或域名(当前错误由SQLite版本引发,这是次要验证项)。 - 可在Django视图中添加代码
import sqlite3; print(sqlite3.sqlite_version),访问页面验证修改后加载的SQLite版本。
内容的提问来源于stack exchange,提问作者Shkfar

