3

我有一个测试 django 项目,我一直在使用 django 开发服务器。我想开始使用实际的 apache 服务器来正确模拟生产环境。我正在使用 Mac OS X。

我一直在这里使用本教程,但在第一组指令中,我从 localhost 获得了 403。浏览器说我没有访问/服务器的权限。

当我从教程中注释掉 apache 配置行时,WSGIScriptAlias / /Users/username/Projects/django_books/django_books/django.wsgi我可以访问 localhost。

这是我的 django.wsgi 文件的内容:

import os
import sys

os.environ['DJANGO_SETTINGS_MODULE'] = 'django_books.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

path = '/Users/username/Projects/django_books/django_books'
if path not in sys.path:
    sys.path.append(path)

是什么导致了 403,为什么我看不到我的 django 应用程序?

编辑

目录结构:

django_books
    apache (empty directory right now)
    random_book
        __init__.py
        models.py
        views.py
    django_books
        __init__.py
        django.wsgi
        settings.py
        urls.py
        views.py
        wsgi.py
    media
    static
        css
            style.css
    manage.py

第二次编辑

所有目录的权限:

/Users/用户名/Projects/django_books/django_books/django.wsgi

-rw-r--r--

/用户/用户名/项目/django_books/django_books

drwxr-xr-x

/用户/用户名/项目/django_books/

drwxr-xr-x

/用户/用户名/项目/

drwxr-xr-x

/用户/用户名/

drwxr-xr-x+

/用户/

drwxr-xr-x
4

3 回答 3

1

这可能与您的 Apache 安装、python 库或文件系统的权限有关。

测试阿帕奇

你没有在你的问题中说出来,但我从你的链接中假设你正在使用 Apache2 和mod_wsgi

您可以通过在 django.wsgi 位置放置一个虚拟 wsgi 脚本来测试 Apache 和 mod_wsgi(或您的 wsgi 模块)是否正常工作。该脚本(从mod_wsgi 的文档中窃取)不依赖 Django,有助于确保 Apache 可以读取和执行 wsgi 脚本:

# test version of django.wsgi
def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                    ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

并重启apache

sudo service apache2 restart

继续测试页面。它奏效了吗?伟大的。撤消对 django.wsgi 脚本的更改,重新启动 Apache 并再次测试。如果 Django 站点仍然无法正常工作,我们需要继续寻找。如果测试脚本不起作用,则您的 Apache 安装可能存在问题。检查 apache 的错误日志以获取有关所发生情况的更多信息。在 linux 上,它通常位于/var/log/apache2/error.log. mod_wsgi可能安装不正确,脚本的守护进程可能对 wsgi 文件没有适当的权限。

更正权限错误

Apache 可能无法读取和执行 wsgi 文件。如其他答案所示,在 wsgi 文件的目录中运行ls -l将告诉您文件所属的用户和组(以及该用户和组是否可以读取、写入或执行给定文件)。默认安装通常具有 wsgi 权限,如下所示:

-rw------- 1 www-data www-data 1470 Aug 29 16:00 django.wsgi

如果你想为守护进程使用不同的用户,你需要确保 apache conf 文件定义WSGIDaemonProccess

WSGIScriptAlias / /Users/username/Projects/django_books/django_books/django.wsgi
WSGIDaemonProcess wsgi_user processes=2 threads=15 display-name=%{GROUP}
WSGIProcessGroup wsgi_group

测试对这些文件的更改并重新启动 Apache 可以帮助缩小范围。继续检查 Apache 日志文件。

阿帕奇配置

Django 关于设置 mod_wsgi 的教程很好,但也请阅读 mod_wsgi 的 wiki。除了WSGIScriptAlias. 确保有一个标签指向您的 wsgi 文件所在的文件夹。如果该目录中有非公共文件(如 django 项目文件),请使用 apache 目录(更新您的 apache conf 文件)或在节点下添加标签以保持其他文件的私有。当您在那里时,您可能会注意到其他看起来有问题的事情,例如配置不正确的服务器名称、多个虚拟主机或其他错误。

测试 Python

如果您使用的是 virtualenv ( do it ),请确保 1.WSGIDaemonProcess变量在变量的 python-path 属性中定义了适当的站点包和 wsgi 脚本的位置 2. 守护程序有权读取您的 virtualenv 中的站点包. 3. 您的 wsgi 脚本正确地导入了 django 和您网站的设置。

记录阿帕奇

您可以通过在 Apache conf 文件中添加几行来提高 Apache 报告的日志记录级别。此设置为您提供了在部署期间可能需要的非常详细的日志记录(确保创建一个日志文件夹):

LogLevel info
ErrorLog /Users/username/Projects/django_books/logs/apache_error.log
CustomLog /Users/username/Projects/django_books/logs/apache_access.log combined
于 2013-08-29T22:18:07.513 回答
1

根据我的小经验,我认为您必须添加以下行“就在 import sys 行的下方以将您的项目放在路径上”(所以就在“import sys”下),就像您引用的教程中所说的那样。另外,删除路径中的第二个“django_books”,因为您想链接到您的网站而不是您网站中的应用程序;-)(本教程中的“mysite”,而不是 mysite/mysite)

import os
import sys

path = '/Users/username/Projects/django_books'
if path not in sys.path:
    sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'django_books.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

再见

于 2013-08-29T14:54:06.930 回答
0

我怀疑 www-data(或任何运行 apache 的用户)无权访问/Users/username/Projects/django_books/django_books.

su给该用户并尝试访问该目录和其中的 wsgi 文件。

要打印所有相关权限:

ls -ld /Users /Users/username /Users/username/Projects /Users/username/Projects/django_books /Users/username/Projects/django_books/django_books /Users/username/Projects/django_books/django_books/django.wsgi

您还应该检查 apache 错误日志,它们可能会告诉您出了什么问题。

于 2013-08-29T14:53:06.773 回答