Ubuntu 16→18升级后生产环境CKAN出现500内部服务器错误
修复Ubuntu 18.04上CKAN 2.7.2生产环境500错误的思路
从你的日志来看,核心问题是系统升级后,Apache的mod_wsgi没有正确使用CKAN的Python虚拟环境,导致系统级Python包(/usr/local/lib/python2.7下的)和虚拟环境内的包(/usr/lib/ckan/default/lib/python2.7)发生版本冲突,尤其是pyutilib.component和pkg_resources这两个依赖。下面是具体的修复步骤:
1. 确保mod_wsgi绑定Python 2.7
Ubuntu 18.04默认同时预装Python 2和Python 3,mod_wsgi可能默认关联了Python 3,或者系统自带的Python 2环境和CKAN虚拟环境不兼容:
- 先检查当前mod_wsgi使用的Python版本:
mod_wsgi -v - 如果输出不是Python 2.7,安装Python 2版本的mod_wsgi并切换:
sudo apt install libapache2-mod-wsgi-py2 sudo a2dismod wsgi # 禁用可能存在的Python 3版mod_wsgi sudo a2enmod wsgi # 启用Python 2版 sudo systemctl restart apache2
2. 修正WSGI脚本的路径优先级
你的apache.wsgi脚本没有确保虚拟环境的包路径优先加载,导致系统包干扰。修改/etc/ckan/default/apache.wsgi内容如下:
# 先激活CKAN虚拟环境 activate_this = '/usr/lib/ckan/default/bin/activate_this.py' exec(open(activate_this).read(), {'__file__': activate_this}) # 强制将虚拟环境的包路径放在最前面,避免系统包干扰 import sys sys.path.insert(0, '/usr/lib/ckan/default/src/ckan') sys.path.insert(0, '/usr/lib/ckan/default/lib/python2.7/site-packages') # 原有的加载逻辑 from paste.deploy import loadapp config_file = '/etc/ckan/default/production.ini' application = loadapp('config:%s' % config_file)
3. 重新安装虚拟环境内的依赖
系统升级可能破坏了虚拟环境内的依赖版本一致性,进入CKAN虚拟环境重新安装所有依赖:
source /usr/lib/ckan/default/bin/activate # 先卸载冲突的包 pip uninstall -y pyutilib component pkg_resources # 重新安装CKAN 2.7要求的依赖 pip install -r /usr/lib/ckan/default/src/ckan/requirements.txt # 手动指定psycopg2版本(你提到的兼容版本) pip install psycopg2==2.7.3.2 deactivate
4. 清理系统级的冲突包
/usr/local/lib/python2.7/dist-packages下的pyutilib等包会干扰虚拟环境,卸载系统级的这些包:
sudo pip2 uninstall -y pyutilib component
5. 验证依赖路径并重启服务
- 进入虚拟环境,确认依赖都加载自虚拟环境:
输出路径应该都在source /usr/lib/ckan/default/bin/activate python -c "import pkg_resources; print(pkg_resources.__file__)" python -c "import pyutilib.component; print(pyutilib.component.__file__)" deactivate/usr/lib/ckan/default/lib/python2.7/site-packages下。 - 最后重启Apache:
再用sudo systemctl restart apache2curl -I 127.0.0.1:8080测试,查看错误日志是否恢复正常。
内容的提问来源于stack exchange,提问作者Wes Hinsley
相关产品推荐
相关产品推荐

