【问题标题】:How to set LD_LIBRARY_PATH individually for django web sites with Apache and mod_wsgi如何使用 Apache 和 mod_wsgi 为 django 网站单独设置 LD_LIBRARY_PATH
【发布时间】:2011-12-12 10:27:43
【问题描述】:

我在 Apache2 上使用 ubuntu 上的 mod_wsgi 部署我的 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?

【问题讨论】:

    标签: django apache mod-wsgi


    【解决方案1】:

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

    【讨论】:

      【解决方案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
      

      【讨论】:

        【解决方案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)
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-15
        • 2014-03-02
        • 2014-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多