Как настроить LD_LIBRARY_PATH индивидуально для веб-сайтов django с Apache и mod_wsgi - PullRequest
10 голосов
/ 21 октября 2011

Я развертываю свои веб-сайты Django на Apache2 с mod_wsgi на ubuntu.

В моих представлениях Django я импортирую модуль, для которого требуется определенный путь, заданный в LD_LIBRARY_PATH.

Когда я устанавливаю LD_LIBRARY_PATHв / etc / apache2 / envvars как:

export LD_LIBRARY_PATH=/home/user/target_libdir:$LD_LIBRARY_PATH

это работает.

Однако на моем сервере я запускаю несколько сайтов django, каждый в отдельной записи VirtualHost, с независимыми сценариями wsgi.

Проблема в том, что веб-сайтам нужно использовать разные версии LD_LIBRARY_PATH.

Итак, как я могу настроить LD_LIBRARY_PATH индивидуально для каждого веб-сайта django?

Ответы [ 3 ]

5 голосов
/ 22 октября 2011

Вы не можете сделать это. LD_LIBRARY_PATH читается только один раз при начальном запуске процесса. Он не может быть установлен после запуска процесса, и вы не можете установить его снова до разветвления. Вы можете установить его до exec, но процессы демона mod_wsgi являются только fork, а не exec.

3 голосов
/ 21 октября 2011

Обновление

Очевидно, что следующее не работает.Оставив это здесь как предупреждение для других.


Может сработать, если вы введете в файл .wsgi.Предполагая, что у вас есть что-то вроде:

import os,sys

sys.path.append('/path/to/django')

os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'
os.environ['LD_LIBRARY_PATH'] = '/path/to/library'

import django.core.handlers.wsgi

_application = django.core.handlers.wsgi.WSGIHandler()

def application(environ,start_response):
  return _application(environ,start_response)
2 голосов
/ 10 февраля 2014

Ну, есть ситуации, когда вы просто не можете установить переменную LD_LIBRARY_PATH до запуска сценария, и вы все равно хотите импортировать одну или две пользовательских библиотеки - скажем, из домашнего каталога на вашем хост-сервере, где у вас есть оченьнемного прав доступа или настройте его для каждого сайта, как в вопросе выше.

В тех случаях, когда все разумные решения недоступны, вы можете загрузить библиотеки с помощью ctypes и затем импортировать модуль, который их использует.Просто принять эту идею, чтобы загрузить все библиотеки из настраиваемой папки для каждого сайта, как в вопросе выше.

Итак, для решения проблемы с libpuzzle с одной зависимостью я в итоге сделал:

from ctypes import *
lib1 = cdll.LoadLibrary('/home/username/lib/libpuzzle.so')
lib2 = cdll.LoadLibrary('/home/username/lib/libgd.so')

import pypuzzle
...