【问题标题】:How do I properly setup my python paths and permissions for Django+mod_wsgi deployment?如何为 Django+mod_wsgi 部署正确设置我的 python 路径和权限?
【发布时间】:2010-02-05 04:44:12
【问题描述】:

我遇到的问题是我的 wsgi 文件无法正确导入 wsgi 处理程序。

/var/log/apache2/error.log 报告:

ImportError: 没有命名模块 django.core.handlers.wsgi

谷歌搜索这带来了几个结果,主要是处理权限错误,因为www-data 无法读取某些文件和/或 pythonpath 不正确。有些解决方案含糊不清,或者在我的情况下不起作用。

背景资料..

我的 /usr/lib 目录..

/usr/lib/python2.4
/usr/lib/python2.5
/usr/lib/python2.6
/usr/lib/python-django

默认的 python 版本是 2.5.2。如果我以普通用户身份打开解释器,我可以import django.core.handlers.wsgi 毫无问题。

如果我切换到www-data,python版本是一样的,我可以导入django.core.handlers.wsgi模块没问题。

在我的 bashrc 中,我将 PYTHONPATH 设置为包含我所有 django 站点的主目录...

export PYTHONPATH=/home/meder/django-sites/:$PYTHONPATH

所以目录结构是:

django-sites/
   test

testdjango-admin createproject创建的目录。

我的虚拟主机:

<VirtualHost *:80>
    ServerName beta.blah.com
    WSGIScriptAlias / /home/meder/django-sites/test/apache/django.wsgi
    Alias /media /home/meder/django-sites/test/media/
</VirtualHost>

/home/meder/django-sites/test/apache/django.wsgi 文件本身:

import os, sys

sys.path.append('/usr/local/django')
sys.path.append('/home/meder/django-sites')
sys.path.append('/home/meder/django-sites/test')
os.environ['DJANGO_SETTINGS_MODULE'] = 'test.settings'

import django.core.handlers.wsgi

application = django.core.handlers.wsgi.WSGIHandler()

最后,我的操作系统是 Debian Lenny,我从 backports 获取了 django 1.1.1。希望这是足够的信息。

更新 #1 - 根据第一个回复,这里是 ldd /usr/lib/apache2/modules/mod_wsgi.so 的结果:

meder@site:/usr/lib/apache2/modules$ ldd mod_wsgi.so
    libpython2.5.so.1.0 => /usr/lib/libpython2.5.so.1.0 (0xb7d99000)
    libpthread.so.0 => /lib/libpthread.so.0 (0xb7d81000)
    libdl.so.2 => /lib/libdl.so.2 (0xb7d7c000)
    libutil.so.1 => /lib/libutil.so.1 (0xb7d78000)
    libm.so.6 => /lib/libm.so.6 (0xb7d52000)
    libc.so.6 => /lib/libc.so.6 (0xb7c14000)
    /lib/ld-linux.so.2 (0xb7efd000)

所以它是针对 python 2.5 而不是 2.4 编译的。

【问题讨论】:

    标签: python django mod-wsgi


    【解决方案1】:

    由于我在 Debian 上,django 似乎在 /usr/lib/pymodules/python2.5 而不是 /usr/lib/python2.5/site-packages

    我加了

    sys.path.append('/usr/lib/pymodules/python2.5') 
    

    到我的 wsgi 文件的顶部并做到了,尽管我觉得我应该以更适当的方式解决这个问题。

    【讨论】:

      【解决方案2】:

      我认为您的问题不在于 sys.path。我一直使用 Mod_WSGI 和 Django 使用守护进程,就像这样,

      # Note these 2 lines
      WSGIDaemonProcess site-1 user=user-1 group=user-1 threads=25
      WSGIProcessGroup site-1
      
      Alias /media/ /usr/local/django/mysite/media/
      
      <Directory /usr/local/django/mysite/media>
      Order deny,allow
      Allow from all
      </Directory>
      
      WSGIScriptAlias / /usr/local/django/mysite/apache/django.wsgi
      
      <Directory /usr/local/django/mysite/apache>
      Order deny,allow
      Allow from all
      

      如果您注意前 2 行 - 您可以指定将运行它的组和用户。在您的情况下,您提到 www-data 可以导入 django 模块,但是当 Apache 部署它时它不起作用 - 也许该进程正在由没人运行,或者其他一些用户/组运行 not 有权导入此模块。添加 DaemonProcess 和 Group 行应该解决您的问题。

      HTH。

      [1] 供参考 - 这是 Django Mod_WSGI 文档 - http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango

      【讨论】:

        【解决方案3】:

        听起来你 mod_wsgi 不是针对 Python 2.5 编译的,而是针对 Python 2.4 或 2.6 编译的。运行:

        ldd mod_wsgi.so
        

        在安装它的 mod_wsgi.so 文件上确定它正在使用什么。

        如果不同,则需要从源代码重新编译 mod_wsgi,使其使用您要使用的版本。

        【讨论】:

        • 我用结果更新了 OP,好像是为 2.5 编译的。
        猜你喜欢
        • 2016-10-02
        • 2016-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多