【问题标题】:Making Django work with Apache让 Django 与 Apache 一起工作
【发布时间】:2013-08-29 14:33:14
【问题描述】:

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

我一直在使用this tutorial here,但在第一组指令中,我从 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--

/Users/用户名/Projects/django_books/django_books

drwxr-xr-x

/Users/用户名/Projects/django_books/

drwxr-xr-x

/用户/用户名/项目/

drwxr-xr-x

/用户/用户名/

drwxr-xr-x+

/用户/

drwxr-xr-x

【问题讨论】:

    标签: python django apache networking model-view-controller


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

    再见

    【讨论】:

    • 我很困惑。您答案中的代码与我的相同;我应该添加哪些行?而第一个 django_books 文件夹只是 virtualevnwrapper 创建的一个容器文件夹。第二个django_books其实是我的项目,所有的app都和它在同一个目录下。
    • 所以你有 3 个文件夹 django_books ? /Users/username/Projects/django_books/django_book/django_book/ 存在吗?我已经编辑了我的答案以正确显示代码和不同部分的顺序。
    • 不同的是@HydrUra在创建WSGIHandler之前添加到sys.path我猜。
    • 可以进行编辑。在此之前,您在“项目”中?在这种情况下,您必须:将 django.wsgi 移动到第一个文件夹 django_books 中,完全按照我发布的代码使用我的代码,同时在 apache 中更改 django.wsgi 的路径。重启apache就可以了!
    • @jefffabiny 您是否尝试移动您的 django.wsgi 并粘贴我编写的代码?它会起作用的......
    【解决方案2】:

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

    测试 Apache

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

    您可以通过在 django.wsgi 位置放置一个虚拟 wsgi 脚本来测试 Apache 和 mod_wsgi(或您的 wsgi 模块)是否正常工作。此脚本(从mod_wsgi's docs 窃取)不依赖于 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.logmod_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 日志文件。

    Apache 配置

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

    测试 Python

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

    记录 Apache

    您可以通过在 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
    

    【讨论】:

    • 感谢您的详尽回复。你能看看我对权限问题的修改吗?
    • 第二次编辑中的权限信息仅有助于您知道谁被授予了这些权限。 ls -l 输出一个没有标题的表格。如果您要添加这些标头,它们将是“文件类型和权限”“硬链接数量”“所有者名称”“组名”“字节大小”“修改时间戳”“文件名”。换句话说,在不知道所有者名称和组名称(ls -l 输出的第 3 和第 4 列中的内容)的情况下,第二次编辑中的权限无济于事。 django.wsgi 是最有可能拥有不正确权限的文件。
    • “其他”权限应该足以授予对文件的访问权限?
    • @DouglasLeeder 我同意。我更喜欢将守护进程指定为文件的所有者,但修改other 权限要简单得多。
    【解决方案3】:

    我怀疑 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 错误日志,它们可能会告诉您出了什么问题。

    【讨论】:

    • 第二个django_books目录的权限是:drwxr-xr-x,文件的权限是:-rw-r--r--
    • @jefffabiny 您是否检查过您可以以网络用户身份访问该目录?该用户还需要所有父目录的执行权限。
    • ls -l / /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
    • 我刚刚编辑了我的问题以包含所有这些权限。
    • @jefffabiny 我会接受戴夫先生当时的建议。
    猜你喜欢
    • 2018-01-26
    • 2017-05-08
    • 2011-04-02
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2023-01-16
    • 2011-08-13
    相关资源
    最近更新 更多