【问题标题】: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。

标签: python django apache mod-wsgi wsgi


【解决方案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/

        【讨论】:

        猜你喜欢
        • 2017-12-25
        • 2016-04-15
        • 2014-03-29
        • 2014-06-04
        • 1970-01-01
        • 2014-05-19
        • 1970-01-01
        • 2019-02-20
        • 1970-01-01
        相关资源
        最近更新 更多