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 的模块错误