Apache mod_wsgi 错误:Forbidden You don't have permission to access / on this server

Posted

技术标签:

【中文标题】Apache mod_wsgi 错误:Forbidden You don\'t have permission to access / on this server【英文标题】:Apache mod_wsgi error: Forbidden You don't have permission to access / on this serverApache mod_wsgi 错误:Forbidden You don't have permission to access / on this server 【发布时间】:2011-06-15 23:36:45 【问题描述】:

我使用的是 Ubuntu 10.04。 我在/home/wong2/Code/python/django2/ 下创建了一个名为atest 的django 项目 并在同一目录下创建一个wsgi文件setting.wsgi 这里是setting.wsgi的内容:

import os 
import sys

path = '/home/wong2/Code/python/django2'

if path not in sys.path:
    sys.path.append(path)
os.environ["DJANGO_SETTINGS_MODULE"] = "atest.settings" 
from django.core.handlers.wsgi import WSGIHandler 
application = WSGIHandler()

这是我添加到我的 httpd.conf 中的内容:

<VirtualHost *:80>
    ServerName localhost
    WSGIScriptAlias / /home/wong2/Code/python/django2/setting.wsgi
    <Directory />
        Options FollowSymLinks
        AllowOverride None
        Order deny,allow  
        Allow from all 
    </Directory>
    <Directory "/home/wong2/Code/python/django2/atest">
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

问题是,当我访问http://localhost 时,它说

禁止

您无权访问 / 在这台服务器上。

非常感谢。

【问题讨论】:

删除第一个目录部分 - 你不需要它,我认为它覆盖了 WSGIAlias。 【参考方案1】:

试试 http://localhost/index.html 会显示 apache 页面吗?

如果你的 wsgi 在 root 上配置正确,它不会。

您收到该错误消息是因为您可能正在向网络服务器询问 www 文件夹的目录列表

编辑:

我的项目总是在

/var/pyproj//pysrc/ 和我放入的服务器文件 /var/py_proj//服务器/

这是我的 wsgi 脚本

import os, sys

import logging
logger =logging.getLogger("")
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler(sys.stderr)
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(levelname)-8s %(messages)s')
handler.setFormatter(formatter)
logger.addHandler(handler)

sys.stdout = sys.stderr
from os.path import abspath, dirname, join
import site

PROJECT_ROOT = abspath(join(dirname(__file__), "../pysrc"))
SETTINGS_LOC = abspath(join(PROJECT_ROOT, ''))
site.addsitedir(SETTINGS_LOC)
os.environ["DJANGO_SETTINGS_MODULE"] = "settings"

from django.core.management import setup_environ
import settings
setup_environ(settings)

sys.path.insert(0, join(PROJECT_ROOT, "apps"))

from django.core.handlers.wsgi import WSGIHandler

application = WSGIHandler()

我使用 vhost.conf

WSGIDaemonProcess pinax_demo user=www-data group=www-data threads=10 python-path=/var/.virtualenvs/pinax_demo/lib/python2.6/site-packages

<Directory /var/py_proj/pinax_demo/server/>
    Order deny,allow
    Allow from all
</Directory>

Alias /pinax_demo /var/py_proj/pinax_demo/server/pinax_demo.wsgi
<Location /pinax_demo/>
    #WSGIProcessGroup must match the WSGIDaemonProcess
    WSGIProcessGroup pinax_demo
    SetHandler wsgi-script
    Options +ExecCGI
</Location>

我将其包含在站点可用文件夹中的文件中,如下所示

<VirtualHost *:8080>
        DocumentRoot /var/www/

        <Directory /var/www/>
                Order deny,allow
                Allow from all
                Options -Indexes FollowSymLinks
                DirectoryIndex index.php
                AllowOverride None
        </Directory>

        ServerAdmin oto@example.com

        LogLevel error
        ErrorLog  /var/srv_logs/apache_error.log
        CustomLog  /var/srv_logs/apache_access.log combined
        #insert
        Include /var/py_proj/pinax_demo/server/vhost.conf
        Include /var/py_proj/<other>/server/vhost.conf
        Include /var/py_proj/<other>/server/vhost.conf

</VirtualHost>

httpd.conf 为空。 Apache 在发送静态文件方面也很糟糕,所以我在端口 8080 上设置了我的 apache,在端口 80 上设置了 nginx,它转发到 apache。您应该可以只更改我的站点可用文件上的端口以在没有 nginx 的情况下运行它,但我不会那样运行

【讨论】:

当我访问localhost/index.html 时,它仍然显示403 Forbidden 错误 再想一想,您的问题可能只是权限问题。如果 www-data(linux apache 用户)无法读取您的主目录,可能会引发该错误。【参考方案2】:

第二个目录块与您安装 WSGI 脚本文件的位置不匹配。尽管将 WSGI 脚本文件粘贴在源代码或其他敏感文件存在的位置(即同一目录或子目录)中,但这是非常糟糕的做法。相反,您应该将其粘贴在它自己的子目录中。因此:

WSGIScriptAlias / /home/wong2/Code/python/django2/atest/apache/setting.wsgi
<Directory "/home/wong2/Code/python/django2/atest/apache">
    Order allow,deny
    Allow from all
</Directory>

所以,在 'atest' 下创建 'apache' 子目录。将 'setting.wsgi' 移动到那个 'apache' 子目录中并将配置更改为上面。

您的问题也可能是由于 Apache 看不到主目录的限制性权限造成的。

去看看:

http://code.google.com/p/modwsgi/wiki/WhereToGetHelp?tm=6#Conference_Presentations

因为它解释了这些权限问题以及诸如在何处粘贴代码和 WSGI 脚本文件之类的问题。

另请阅读:

http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango

【讨论】:

【参考方案3】:

由于文件权限受限,我遇到了同样的问题。

默认情况下,您的主文件夹用户具有以下设置:

ls -l /home/

drwx----- 36 个用户 user 12288 Nov 28 20:56 user

意味着除了你自己之外没有其他人甚至可以浏览该文件夹。

向文件夹添加执行选项解决了我的问题

chmod o+x /home/user/
ls -l /home/

drwx-----x 36 用户用户 12288 Nov 28 20:56 用户

【讨论】:

【参考方案4】:

您可能会惊讶地发现您的 WSGI 有它的主目录!在我公认的天真的 wsgi_mod 安装中,它是 / - 我很惊讶我不得不编写这个脚本来确保:

import os

def application(environ, start_response):
    status = '200 OK'; e=os.listdir(os.getcwd())
    output = '''WSGI %s<hr>'''%(e)
    response_headers = [('Content-type', 'text/html'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]

这意味着导入的应用程序需要找到完整路径,例如:

sys.path.append('/home/foo/www/Forms')
from DataCommon import page

这是(由 Google)推荐的方法:

import sys; path='/home/foo/www/Forms';
if path not in sys.path: sys.path.append(path)

【讨论】:

【参考方案5】:

对于 Django 1.5+,您应该使用文档中描述的建议方式:

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonPath /path/to/mysite.com

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

https://docs.djangoproject.com/en/1.7/howto/deployment/wsgi/modwsgi/

【讨论】:

仅供参考 - Require all granted 仅适用于 Apache 2.4.x 并且基于 OP 的 httpd.conf似乎他使用的是 2.2.x 或至少语法为这样的。也就是说,很好的答案! Django 3 的新链接:docs.djangoproject.com/en/3.0/howto/deployment/wsgi/modwsgi

以上是关于Apache mod_wsgi 错误:Forbidden You don't have permission to access / on this server的主要内容,如果未能解决你的问题,请参考以下文章

使用 apache mod_wsgi 的 Django 多个站点:请求到错误的站点

Apache mod_wsgi 在部署 Django 项目时抛出错误“403 Forbidden”

Apache Django mod_wsgi - 没有名为 urls 的模块错误

403重定向不起作用

Flask、mod_wsgi 和 Apache:ImportError

使用 mod_wsgi 在 apache 上设置 Django