让Django与Apache一起工作

时间:2013-08-29 14:33:15

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

我有一个测试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

2ND EDIT

所有目录的权限:

/Users/username/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

3 个答案:

答案 0 :(得分:1)

根据我的小经验,我认为你必须在导入系统行下方添加以下行,以便将项目放在路径上(所以在“import sys”下面的juste)就像在你引用的教程中所说的那样。另外,删除路径中的第二个“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()

再见

答案 1 :(得分:1)

这可能是与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变量在变量的python-path属性中定义了相应的site-packages和wsgi脚本的位置。  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

答案 2 :(得分: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错误日志,它们可能会告诉您出了什么问题。