2011-10-21 47 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 
相关问题