我遇到了一些奇怪的错误,到目前为止我已经解决了。
我有一个 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 来解决这个问题