Я запускаю Django в экземпляре RHEL в Apache / mod_wsgi, и у меня возникают проблемы с установкой некоторых переменных среды для процесса Python. Все компоненты (Apache, Python, mod_wsgi, внешние библиотеки) собираются из исходного кода, а не устанавливаются из репозиториев.
Конкретная проблема - поддержка поддержки Oracle. Я могу без проблем подключиться к экземплярам Oracle, если установлю ORACLE_HOME
и LD_LIBRARY_PATH
в командной строке при запуске Python, но я не могу передать эти переменные процессу WSGI.
Конкретное сообщение об ошибке, которое я получаю в журналах Apache:
ImproperlyConfigured: Error loading cx_Oracle module: libclntsh.so.11.1: cannot open shared object file: No such file or
каталог
Я попытался установить переменные в VirtualHost (используя SetEnv
), Файл envvars Apache, файл .bashrc пользователя apache и файл .wsgi (с использованием os.environ['ORACLE_HOME']='...'
), все безрезультатно. В первых трех случаях переменные, похоже, вообще не связаны с Python - печать os.environ['ORACLE_HOME']
указывает, что значение не задано.
Я также попытался перестроить mod_wsgi.so из исходного кода с LD_RUN_PATH
evn var set, согласно совету здесь: http://groups.google.com/group/modwsgi/browse_thread/thread/91dfa97330dfca2/474f818304d741d4 Однако и это было неэффективно.
Что мне не хватает? Как я могу успешно пройти эти env vars? Заранее спасибо!
В Ubuntu размещение
export ORACLE_HOME=<your oracle home>
export LD_LIBRARY_PATH=<your library path>
в /etc/apache2/envvars
кажется, делает свое дело.
Если ничто другое не помогает, вы можете отредактировать свои сценарии запуска Apache и поместить над строками экспорта непосредственно перед запуском демона Apache (я помню, что давно уже делал что-то подобное в Debian).
Поскольку вы создали Apache из исходного кода, вы могли бы добавить в файл envvars в том же каталоге, что и исполняемый файл httpd, следующие строки:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/some/path/to/oracle/lib/directory
export LD_LIBRARY_PATH
Метод LD_RUN_PATH при компиляции mod_wsgi также должен работать, но поскольку вы не показываете точные методы, которые вы использовали, то есть выполняемые команды, чтобы попытаться получить эту работу, не можете комментировать, почему это не сработало. Хотя это будет иметь форму:
make distclean
./configure
LD_RUN_PATH=some/path/to/oracle/lib/directory make
sudo make install
Итак, установите LD_RUN_PATH в той же строке при запуске make. Если вы установите ее отдельно как переменную среды перед запуском make, вы должны «экспортировать» переменную среды, иначе make не передаст ее компилятору.
Другое возможное решение - установить LD_LIBRARY_PATH в сценарии запуска - например, в /etc/init.d/httpd
:
export ORACLE_HOME=<your oracle home>
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
Ключ, похоже, заключался в добавлении библиотек Oracle в ld.so.conf
.