如何在 Apache 和 mod_wsgi 中使用 Django

使用 Apachemod_wsgi 部署 Django 是一种久经考验的将 Django 部署到生产环境的方法。

mod_wsgi 是一个 Apache 模块,可以托管任何 Python WSGI 应用程序,包括 Django。Django 可以与任何支持 mod_wsgi 的 Apache 版本一起使用。

mod_wsgi 官方文档 是关于如何使用 mod_wsgi 的所有详细信息的来源。您可能需要从 安装和配置文档 开始。

基本配置

安装并激活 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 行中的第一部分是您要在其上提供应用程序的基本 URL 路径(/ 表示根 URL),第二部分是系统上“WSGI 文件”(见下文)的位置,通常位于您的项目包内(本例中为 mysite)。这告诉 Apache 使用该文件中定义的 WSGI 应用程序来服务给定 URL 下的任何请求。

如果在 virtual environment 中安装项目的 Python 依赖项,请使用 WSGIPythonHome 添加路径。有关更多详细信息,请参阅 mod_wsgi 虚拟环境指南

WSGIPythonPath 行确保您的项目包可在 Python 路径上导入;换句话说,import mysite 可以工作。

<Directory> 部分确保 Apache 可以访问您的 wsgi.py 文件。

接下来,我们需要确保存在具有 WSGI 应用程序对象的 wsgi.py。从 Django 1.4 版本开始,startproject 将为您创建一个;否则,您需要创建它。有关应在此文件中放置的默认内容以及可以添加的其他内容,请参阅 WSGI 概述文档

警告

如果在单个 mod_wsgi 进程中运行多个 Django 站点,则所有站点都将使用恰好首先运行的站点的设置。可以通过更改

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

wsgi.py 中,更改为

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

或通过 使用 mod_wsgi 守护进程模式 并确保每个站点都在其自己的守护进程中运行来解决此问题。

修复文件上传的 UnicodeEncodeError

如果在上传或写入包含非 ASCII 字符的文件名或内容的文件时出现 UnicodeEncodeError,请确保 Apache 配置为支持 UTF-8 编码

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

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

或者,如果您 使用 mod_wsgi 守护进程模式,可以将 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 官方文档

提供文件

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

我们建议使用单独的 Web 服务器(即,不是也运行 Django 的服务器)来提供媒体文件。以下是一些不错的选择

但是,如果您别无选择,只能在与 Django 相同的 Apache VirtualHost 上提供媒体文件,您可以设置 Apache 将某些 URL 作为静态媒体提供服务,而其他 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 位于 INSTALLED_APPS 中时,Django 开发服务器会自动提供管理应用程序(以及任何其他已安装的应用程序)的静态文件。但是,当您使用任何其他服务器安排时,情况并非如此。您有责任设置 Apache 或您正在使用的任何 Web 服务器来提供管理文件。

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

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

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

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

  3. 复制管理静态文件,以便它们位于您的 Apache 文档根目录中。

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

Django 提供了一个处理器,允许 Apache 直接对 Django 的身份验证后端进行用户身份验证。请参见 mod_wsgi 身份验证文档

返回顶部