2011-10-21 15 views
7

Wdrażam moje strony internetowe Django na Apache2 z mod_wsgi na ubuntu.Jak ustawić LD_LIBRARY_PATH indywidualnie dla witryn Django z Apache i mod_wsgi

W moich widokach Django, importuję moduł, który wymaga określonego zestawu ścieżek w LD_LIBRARY_PATH.

Kiedy ustawić LD_LIBRARY_PATH w/etc/apache2/envvars jak:

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

to działa.

Jednak na moim serwerze uruchamiam wiele witryn internetowych django, każdy w niezależnym wpisie VirtualHost, z niezależnymi skryptami wsgi.

Problem polega na tym, że strony internetowe muszą używać różnych wersji LD_LIBRARY_PATH.

Jak zatem ustawić LD_LIBRARY_PATH indywidualnie dla każdej witryny Django?

Odpowiedz

5

Nie możesz tego zrobić. LD_LIBRARY_PATH jest tylko raz czytany przy początkowym uruchomieniu procesu. Nie można go ustawić po uruchomieniu procesu ani ustawić go ponownie przed rozwidleniem. Możesz ustawić go przed exec, ale procesy demona mod_wsgi są tylko fork, a nie exec.

3

Aktualizacja

Poniższa najwyraźniej nie działa. Zostawiając to tutaj jako ostrzeżenie dla innych.


może działać, jeśli ustawisz w w pliku .wsgi. Zakładając, że masz coś takiego:

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) 
+4

nie mogę dostać pracy w ten sposób, a przy okazji nie sądzę, rozwiązanie to ma działać na wszystko. Jeśli rozumiem poprawnie LD_LIBRARY_PATH, należy go ustawić przed uruchomieniem Pythona, jak wyjaśniono tutaj: http://stackoverflow.com/questions/1178094/change-current-process-environment i tutaj http://stackoverflow.com/questions/856116/ change-ld-library-path-at-runtime-for-ctypes – jan

2

Istnieją sytuacje, w których po prostu nie można ustawić zmiennej LD_LIBRARY_PATH przed uruchomieniem skryptu i nadal chcesz zaimportować jedną lub dwie niestandardowe biblioteki - powiedzmy z katalogu domowego na serwerze hostingowym, gdzie masz bardzo mało praw dostępu lub dostosuj go dla każdej witryny, jak w powyższym pytaniu.

W tych przypadkach, w których wszystkie rozsądne rozwiązania nie są dostępne, można załadować biblioteki przy użyciu ctypów i zaimportować moduł, który ich używa. Łatwo jest zastosować ten pomysł, aby załadować wszystkie biblioteki z niestandardowego folderu dla każdej witryny, jak w powyższym pytaniu.

więc do wydania miałem z libpuzzle z jednego uzależnienia skończyło się robi:

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

import pypuzzle 
Powiązane problemy