如何使用Apache和mod_wsgi为django网站单独设置LD_LIBRARY_PATH

时间:2011-10-21 09:13:29

标签: django apache mod-wsgi

我在Apache2上使用mod_wsgi在ubuntu上部署我的Django网站。

在我的Django视图中,我导入了一个需要在LD_LIBRARY_PATH中设置特定路径的模块。

当我在/ etc / apache2 / envvars中设置LD_LIBRARY_PATH时:

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

它有效。

但是,在我的服务器上,我使用独立的wsgi脚本运行多个django网站,每个网站都在独立的VirtualHost条目中。

问题是网站需要使用不同的LD_LIBRARY_PATH版本。

那么,如何为每个django网站单独设置LD_LIBRARY_PATH?

3 个答案:

答案 0 :(得分:5)

你不能这样做。 LD_LIBRARY_PATH仅在初始进程启动时读取一次。它不能在进程运行时设置,也不能在fork之前再次设置它。你可以在exec之前设置它,但是mod_wsgi守护进程只是fork而不是exec。

答案 1 :(得分: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)

答案 2 :(得分: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