2011-10-21 49 views
7

我在ubuntu上使用mod_wsgi在Apache2上部署我的Django網站。如何分別爲Apache和mod_wsgi設置django網站的LD_LIBRARY_PATH

在我的Django視圖中,我導入需要在LD_LIBRARY_PATH中設置的特定路徑的模塊。

當我設置LD_LIBRARY_PATH在/ etc/apache2的/ envvars中爲:

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

它的工作原理。

但是,在我的服務器上,我使用獨立的wsgi腳本運行多個django網站,每個網站都在獨立的VirtualHost條目中。

問題是網站需要使用不同的LD_LIBRARY_PATH版本。

那麼,如何爲每個django網站分別設置LD_LIBRARY_PATH?

回答

5

你不能這樣做。 LD_LIBRARY_PATH在初始進程啓動時只讀取一次。一旦進程運行,它不能被設置,也不能在fork之前重新設置它。你可以在exec之前設置它,但mod_wsgi守護進程只是fork而不是exec。

3

更新

下顯然是行不通的。留在這裏作爲對他人的警告。如果您在您的.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) 
+4

我不能讓它以這種方式工作,順便說一句,我不認爲這個解決方案應該是在工作所有。如果我理解正確LD_LIBRARY_PATH必須在python執行之前設置,如下所述:http://stackoverflow.com/questions/1178094/change-current-process-environment和這裏http://stackoverflow.com/questions/856116/改變-LD-庫路徑在運行時換ctypes的 – jan

2

那麼有些情況下,在腳本運行之前您無法設置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 
相關問題