Apache、mod_wsgi、未通过 SSH 连接到服务器时出现 Django 错误

Apache、mod_wsgi、未通过 SSH 连接到服务器时出现 Django 错误

我遇到了一些奇怪的错误,到目前为止我已经解决了。

我有一个 Ubuntu 服务器,由 Apache + mod_wsgi + Django 设置。当我通过 SSH 连接到服务器时,我可以从另一台机器上的浏览器正常访问网站,一切看起来都很棒。当我没有通过 SSH 连接到服务器时,我的浏览器会显示 404 Not Found,Apache 日志中的错误如下:

[2012 年 4 月 18 日星期三 10:15:02] [错误] [客户端] 目标 WSGI 脚本未找到或无法统计:/home/zen/kiosk

(这个错误最让我困扰的是,目标 WSGI 脚本不是我在 apache 配置文件中列出的完整路径)

版本:

  • Ubuntu 10.10 64 位
  • Apache 2.2.16
  • Python 2.6.6
  • Django 1.3.1
  • mod_wsgi 的新功能

Apache 配置:

Alias /static/ /home/zen/kiosk/static/

User zen

<Directory /home/zen/kiosk/static>
Order deny,allow
Allow from all
</Directory>

WSGIScriptAlias / /home/zen/kiosk/server/config/django.wsgi
#Alias / /home/zen/kiosk/server/config/django.wsgi

<Directory /home/zen/kiosk/server/config>
Order allow,deny
Allow from all
</Directory>

当仅使用 Alias 而不是 WSGIScriptAlias(如配置文件中注释掉的那样)时,如果我通过 SSH 登录,我能够看到 wsgi 文件,但是会得到与上面相同的 404 错误信息:

[2012 年 4 月 18 日星期三 11:10:01] [错误] [客户端] 文件不存在:/home/zen/kiosk

WSGI 配置(/home/zen/kiosk/server/config/django.wsgi)

import os, sys

sys.path.insert(0, '/home/zen/kiosk/server')
sys.path.insert(0, '/home/zen/kiosk')

os.environ['DJANGO_SETTINGS_MODULE'] = 'server.settings'
os.environ['PYTHON_EGG_CACHE'] = '/var/www/.python-eggs'
os.environ["CELERY_LOADER"] = "django"

import django.core.handlers.wsgi

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

sys.stdout = sys.stderr

/home/zen/kiosk 及之下的所有内容都被 chmode 为 755,但这似乎并不重要。

drwxr-xr-x 8 zen zen 4096 2012-04-16 16:13 /home/zen
zen@KioskServer:~$ ls -ld /home/zen/kiosk
drwxr-xr-x 8 zen zen 4096 2012-04-11 12:52 /home/zen/kiosk
zen@KioskServer:~$ ls -ld /home/zen/kiosk/server/
drwxr-xr-x 8 zen zen 4096 2012-04-16 15:05 /home/zen/kiosk/server/
zen@KioskServer:~$ ls -ld /home/zen/kiosk/server/config/
drwxr-xr-x 3 zen zen 4096 2012-04-03 22:05 /home/zen/kiosk/server/config/
zen@KioskServer:~$ ls -l /home/zen/kiosk/server/config/django.wsgi
-rwxr-xr-x 1 zen zen 504 2012-04-16 14:44 /home/zen/kiosk/server/config/django.wsgi

当我从 Apache 配置文件中删除“用户 zen”时,只要我没有通过 SSH 进入服务器,我就会收到以下错误而不是目标 WSGI 脚本错误。

[2012 年 4 月 18 日星期三 10:29:02] [错误] [客户端](13)权限被拒绝:访问/login/被拒绝

我的浏览器出现 403 Forbidden 错误。当我通过 SSH 登录时也不会出现此错误。

这感觉像是权限错误,或者可能是某些路径变量的问题。不幸的是,我现在有点卡住了,不知道还能尝试什么。

谢谢

编辑:我在另一个帖子上看到有人询问这个命令 (dpkg -l *apache* |grep -E '^ii'),所以我想我现在就添加它。我以前有 prefork,但当有人建议它可能有帮助时,我切换到了 worker。prefork 和 worker 中发生的错误完全相同。

ii  apache2                         2.2.16-1ubuntu3.5                Apache HTTP server metapackage 
ii  apache2-mpm-worker              2.2.16-1ubuntu3.5                Apache HTTP Server - high speed threaded model 
ii  apache2-utils                   2.2.16-1ubuntu3                  utility programs for webservers 
ii  apache2.2-bin                   2.2.16-1ubuntu3.5                Apache HTTP Server common binary files 
ii  apache2.2-common                2.2.16-1ubuntu3.5                Apache HTTP Server common files 
ii  libapache2-mod-wsgi             3.2-2                            Python WSGI adapter module for Apache

编辑 2:这似乎与加密主目录有关,我不知道这台服务器上有这个目录。由于声誉问题,我暂时无法发布答案,但我会在可以的时候发布,这样遇到同样问题的人就能更快地找到解决办法。

答案1

经过两天的搜索,我找到了另一个人同样的问题

基本上,服务器设置了加密主目录(我不知道),所以当我登录并测试时,一切都按预期进行。但是一旦我退出,Apache 就无法再使用主目录了。

希望其他人遇到此问题时,此帖子能帮到他们。我发现查看您是否有加密主目录的最快方法是运行:

$ mount | grep ecryptfs

“解密”你的主目录的过程似乎很痛苦,所以我通过将我的 Django 目录移出 /home 并移到 /var/www 来解决这个问题

相关内容