如何为Django+mod_wsgi部署正确设置Python路径和权限?

3 投票
3 回答
6678 浏览
提问于 2025-04-15 18:55

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

/var/log/apache2/error.log报告了以下错误:

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

在网上搜索这个问题,找到了几个结果,大多数是关于权限错误的,因为www-data无法读取某些文件,或者python路径不正确。有些解决方案比较模糊,或者在我的情况下根本不管用。

背景信息..

我的/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

test是通过django-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。

3 个回答

0

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

ldd mod_wsgi.so

在安装了 mod_wsgi.so 文件的地方,查看它使用的是什么版本。

如果版本不一样,你就需要从源代码重新编译 mod_wsgi,确保它使用你想要的版本。

1

我觉得你的问题不在于 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

如果你注意前两行,你可以指定运行这个进程的用户和组。在你的情况下,你提到 www-data 可以导入 django 模块,但在 Apache 部署时却不行——可能是因为这个进程是由 nobody 或其他没有权限的用户/组在运行。添加 DaemonProcess 和 Group 这两行应该能解决你的问题。

希望这对你有帮助。

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

2

因为我在使用Debian系统,所以看起来Django这个框架在/usr/lib/pymodules/python2.5这个地方,而不是在/usr/lib/python2.5/site-packages

我在我的wsgi文件的顶部加了

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

这样就解决了问题,不过我觉得我应该用更合适的方式来处理这个问题。

撰写回答