我遇到了一个问题:在 Apache/mod_wsgi/Django 部署的服务器上找不到 MySQL 库,尽管 Python 本身可以正确导入该库。
这是我的 Apache 日志错误:
[Tue Jul 10 12:52:02 2012] [error] [client 127.0.0.1] File "/remote/projects1/pdrtke/python/lib/python2.6/site-packages/Django-1.3-py2.6.egg/django/utils/importlib.py", line 35, in import_module
[Tue Jul 10 12:52:02 2012] [error] [client 127.0.0.1] __import__(name)
[Tue Jul 10 12:52:02 2012] [error] [client 127.0.0.1] File "/remote/projects1/pdrtke/python/lib/python2.6/site-packages/Django-1.3-py2.6.egg/django/db/backends/mysql/base.py", line 14, in <module>
[Tue Jul 10 12:52:02 2012] [error] [client 127.0.0.1] raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e)
[Tue Jul 10 12:52:02 2012] [error] [client 127.0.0.1] ImproperlyConfigured: Error loading MySQLdb module: libmysqlclient_r.so.16: cannot open shared object file: No such file or directory
我已经尝试了以下操作:
- 检查 Python 解释器是否可以执行以下操作
import MySQLdb
:好的 - 检查
python manage.py ...
需要数据库支持的操作是否有效:好的 - 检查
LD_LIBRARY_PATH
指向 libmysqlclient_r.so.16 可用的目录:好的 - 将
httpd
流程附加到,gdb
然后执行show env
:LD_LIBRARY_PATH
指向libmysqlclient_r.so.16
- 修改
envvars
bin/http 目录中的文件,添加export LD_LIBRARY_PATH=...
(以防万一):好的 - 检查
ldd libmysqlclient_r.so.16
库本身是否包含未解决的依赖项 - 检查
httpd
可执行文件是否未设置 setuid 位;这是忽略以下内容的有据可查的原因LD_LIBRARY_PATH
:好的
这些措施似乎都无法解决我的问题。我是不是忘记考虑了什么显而易见的事情?
答案1
现在已经修复了。这是我犯的一个愚蠢的错误。
我最初有一个LD_LIBRARY_PATH
没有好目录的,所以修复了它,但是......在更改之后LD_LIBRARY_PATH
,我发布了一个apachectl restart
,正如 Apache 所记录的那样,它只会杀死子进程,并从现有父进程中产生新的子进程。
因此,新生儿仍保留着旧版本的LD_LIBRARY_PATH
。
现在我不太明白为什么我看到的 LD_LIBRARY_PATH 是“好的” gdb
。show environment
但这是另一个故事。我将结束我最初的问题,现在这个问题已经解决了。