如何为使用Apache和mod_wsgi的Django网站单独设置LD_LIBRARY_PATH?

10

我使用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

它有效。

然而,在我的服务器上,我运行多个Django网站,每个网站都有独立的VirtualHost条目和独立的wsgi脚本。

问题在于这些网站需要使用不同版本的LD_LIBRARY_PATH。

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


请参考这个答案来解决类似问题。 - Halmackenreuter
3个回答

6

无法完成此操作。LD_LIBRARY_PATH仅在初始进程启动时读取一次。无法在进程运行时设置它,也不能在fork之前再次设置它。您可以在exec之前设置它,但是mod_wsgi守护进程只能使用fork而不是exec。


4
有些情况下,在运行脚本之前无法设置LD_LIBRARY_PATH变量,但您仍然想从托管服务器上的home目录中导入一两个自定义库,例如在问题中为每个站点定制。
在这些情况下,如果所有合理的解决方案都不可用,则可以使用ctypes加载库,然后再导入使用它们的模块。像上面的问题一样,很容易采用这种方式从自定义文件夹加载所有库。
因此,对于我遇到的具有一个依赖项的libpuzzle问题,我最终执行了以下操作:
from ctypes import *
lib1 = cdll.LoadLibrary('/home/username/lib/libpuzzle.so')
lib2 = cdll.LoadLibrary('/home/username/lib/libgd.so')

import pypuzzle

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 之前设置,就像这里解释的一样:https://dev59.com/B3M_5IYBdhLWcg3w43pt 和 https://dev59.com/YXRA5IYBdhLWcg3wtwSe - jan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接