Apache mod_wsgi错误:禁止您无权访问此服务器上的/

时间:2011-01-26 16:39:19

标签: python django apache mod-wsgi wsgi

我正在使用Ubuntu 10.04 我在名为/home/wong2/Code/python/django2/的{​​{1}}下创建了一个django项目 并在同一目录中创建一个wsgi文件atest 以下是setting.wsgi

的内容
setting.wsgi

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

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()

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

  

禁止

     

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

非常感谢。

5 个答案:

答案 0 :(得分:17)

第二个目录块与安装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'子目录中,并将config更改为上面。

你的问题也可能是由于你无法在里面看到主目录上的限制性权限造成的。

去观看:

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

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

同时阅读:

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

答案 1 :(得分:9)

使用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/

答案 2 :(得分:6)

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

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

ls -l /home/
  

drwx ------ 36位用户12288 11月28日20:56用户

意味着除了你自己以外没有人能够浏览该文件夹。

在文件夹中添加执行选项修复了我的问题

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

drwx ----- x 36用户用户12288 11月28日20:56用户

答案 3 :(得分:0)

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

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

您收到该错误消息,因为您可能正在向Web服务器询问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>

我将其包含在看似此内容的文件中的sites-available文件夹中

<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的情况下运行它,但我不会那样生活

答案 4 :(得分:-1)

您可能会对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)