如何将Django与Apache和 mod_wsgi

使用部署Django Apachemod_wsgi 是一种尝试和测试的方式,以使 Django 进入生产。

mod_wsgi是一个Apache模块,可以承载任何python WSGI 应用程序,包括Django。Django将使用任何支持mod wsgi的Apache版本。

这个 official mod_wsgi documentation 是关于如何使用mod wsgi的所有详细信息的来源。你可能想从 installation and configuration documentation .

基本配置

安装并激活mod wsgi后,编辑Apache服务器的 httpd.conf 文件并添加以下内容。

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py
WSGIPythonHome /path/to/venv
WSGIPythonPath /path/to/mysite.com

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

中的第一个位 WSGIScriptAlias line is the base URL path you want to serve your application at (/ indicates the root url), and the second is the location of a "WSGI file" -- see below -- on your system, usually inside of your project package (`` mysite``在这个例子中)。这会告诉Apache使用该文件中定义的wsgi应用程序来服务给定URL下的任何请求。

如果将项目的python依赖项安装到 virtual environment ,使用添加路径 WSGIPythonHome . 见 mod_wsgi virtual environment guide 了解更多详细信息。

这个 WSGIPythonPath 行确保您的项目包可以在python路径上导入;换句话说,就是 import mysite 作品。

这个 <Directory> piece确保Apache可以访问 wsgi.py 文件。

接下来我们要确保 wsgi.py 存在具有wsgi应用程序对象的。从Django 1.4版开始, startproject 将为您创建一个;否则,您需要创建它。见 WSGI overview documentation 对于默认的内容,您应该放在这个文件中,还有什么可以添加到文件中。

警告

如果多个Django站点在一个mod wsgi进程中运行,那么所有这些站点都将使用任何一个先运行的设置。这可以通过更改来解决:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{{ project_name }}.settings")

在里面 wsgi.py ,以:

os.environ["DJANGO_SETTINGS_MODULE"] = "{{ project_name }}.settings"

或通过 using mod_wsgi daemon mode 并确保每个站点都在自己的守护进程中运行。

定影 UnicodeEncodeError 用于文件上载

如果你得到了一个 UnicodeEncodeError 上载或写入包含非ASCII字符的文件名或内容的文件时,请确保将Apache配置为支持UTF-8编码:

export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'

放置此配置的常见位置是 /etc/apache2/envvars .

或者,如果您是 using mod_wsgi daemon mode 您可以添加 langlocale 选项添加到 WSGIDaemonProcess 指令:

WSGIDaemonProcess example.com lang='en_US.UTF-8' locale='en_US.UTF-8'

文件夹 有关详细信息,请参阅Unicode参考指南的部分。

使用 mod_wsgi 守护进程模式

“守护程序模式”是运行mod wsgi(在非Windows平台上)的推荐模式。要创建所需的守护进程组并委托要在其中运行的Django实例,需要添加适当的 WSGIDaemonProcessWSGIProcessGroup 指令。如果使用守护进程模式,则需要对上述配置进行进一步更改,因为您不能使用 WSGIPythonPath ;相反,您应该使用 python-path 选择权 WSGIDaemonProcess 例如:

WSGIDaemonProcess example.com python-home=/path/to/venv python-path=/path/to/mysite.com
WSGIProcessGroup example.com

如果要在子目录中为项目提供服务 (https://example.com/mysite 在这个例子中),您可以添加 WSGIScriptAlias 以上配置:

WSGIScriptAlias /mysite /path/to/mysite.com/mysite/wsgi.py process-group=example.com

参见官方的mod wsgi文档 details on setting up daemon mode .

服务文件

Django本身并不提供文件服务;它将这项工作留给您选择的任何Web服务器。

我们建议使用单独的Web服务器--即不同时运行Django的服务器--来提供媒体服务。以下是一些不错的选择:

但是,如果您没有选择,只能在同一个Apache上提供媒体文件 VirtualHost 作为django,您可以设置apache以将一些URL作为静态媒体,而其他则使用mod wsgi接口来提供给django。

这个例子在站点根目录下设置了django,但是 robots.txtfavicon.ico 以及 /static//media/ 作为静态文件的URL空间。所有其他URL将使用mod wsgi提供:

Alias /robots.txt /path/to/mysite.com/static/robots.txt
Alias /favicon.ico /path/to/mysite.com/static/favicon.ico

Alias /media/ /path/to/mysite.com/media/
Alias /static/ /path/to/mysite.com/static/

<Directory /path/to/mysite.com/static>
Require all granted
</Directory>

<Directory /path/to/mysite.com/media>
Require all granted
</Directory>

WSGIScriptAlias / /path/to/mysite.com/mysite/wsgi.py

<Directory /path/to/mysite.com/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

提供管理文件

什么时候 django.contrib.staticfiles vt.在.中 INSTALLED_APPS ,Django开发服务器自动提供管理应用程序(以及任何其他安装的应用程序)的静态文件。但是,当您使用任何其他服务器配置时,情况并非如此。您负责设置ApacheWeb服务器或您正在使用的任何Web服务器来提供管理文件。

管理文件位于 (django/contrib/admin/static/admin Django发行版)。

我们 strongly 推荐使用 django.contrib.staticfiles 要处理管理文件(以及上一节中概述的Web服务器;这意味着使用 collectstatic 用于收集静态文件的管理命令 STATIC_ROOT ,然后配置您的Web服务器以提供 STATIC_ROOT 在… STATIC_URL ),但这里还有其他三种方法:

  1. 从文档根目录中创建指向管理静态文件的符号链接(这可能需要 +FollowSymLinks 在您的Apache配置中)。

  2. 使用一个 Alias 指令,如上所示,为适当的URL(可能 STATIC_URL + admin/ )到管理文件的实际位置。

  3. 复制管理静态文件,使其位于Apache文档根目录中。

从Apache对Django的用户数据库进行身份验证

Django提供了一个处理程序,允许Apache根据Django的身份验证后端直接对用户进行身份验证。见 mod_wsgi authentication documentation .