Apache / mod_wsgi / Django не может найти общую библиотеку MySQL
Я застрял в случае, когда библиотеки MySQL не будут найдены на развернутом сервере Apache/mod_wsgi/Django, хотя только 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 ...
действия, требующие поддержки базы данных: Ok - Проверь это
LD_LIBRARY_PATH
указывает на каталог, в котором доступна libmysqlclient_r.so.16: Ok - Прикрепить
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
"s show environment
, Но это другая история. Я закрою свой первоначальный вопрос, который сейчас решен.