Apache / mod_wsgi / Django não pode encontrar a biblioteca compartilhada MySQL

1

Estou preso a um caso em que as bibliotecas do MySQL não serão encontradas em um servidor implementado Apache / mod_wsgi / Django, embora o Python sozinho possa importar a biblioteca corretamente.

Aqui estão os meus erros de log do 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

Eu já tentei o seguinte:

  • Verifique se o interpretador Python pode fazer import MySQLdb : Ok
  • Verifique se python manage.py ... de ações que exigem suporte de banco de dados funcionam: Ok
  • Verifique se LD_LIBRARY_PATH aponta para um diretório em que libmysqlclient_r.so.16 está disponível: Ok
  • Anexe o processo httpd com gdb e faça um show env : os LD_LIBRARY_PATH pontos para libmysqlclient_r.so.16 também
  • Modifique o arquivo envvars no diretório bin / http para adicionar um export LD_LIBRARY_PATH=... (apenas no caso): Ok
  • Verifique por ldd libmysqlclient_r.so.16 se a biblioteca em si não contém dependências não resolvidas
  • Verifique se o executável httpd não tem o setuid bit set; que é um motivo documentado para ignorar o LD_LIBRARY_PATH : Ok

Nenhuma dessas ações parece resolver meu problema. Existe uma coisa óbvia que eu esqueci de considerar?

    
por gyin 10.07.2012 / 13:02

1 resposta

0

Agora está consertado. Isso foi um erro estúpido de mim.

Inicialmente tive um LD_LIBRARY_PATH sem o diretório bom, então consertei, mas ... Depois de alterar o LD_LIBRARY_PATH , emiti um apachectl restart , que, conforme documentado pelo Apache, apenas mata os processos filhos e gera novos filhos do pai existente.

Assim, os novos filhos continuaram tendo a versão antiga do LD_LIBRARY_PATH .

Agora, não sei ao certo por que vi o "bom" LD_LIBRARY_PATH com gdb ' show environment '. Mas esta é uma história diferente. Vou fechar minha pergunta inicial, que agora está resolvida.

    
por 10.07.2012 / 14:34