如何在 Apache 和 mod_wsgi 中使用 Django — Django 文档

来自菜鸟教程
Django/docs/2.2.x/howto/deployment/wsgi/modwsgi
跳转至:导航、​搜索

如何在 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 文件并添加以下内容。 如果您使用的 Apache 版本早于 2.4,请将 Require all granted 替换为 Allow from all,并在其上方添加行 Order deny,allow

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 下的任何请求。

如果您将项目的 Python 依赖项安装在 virtualenv 中,请使用 WSGIPythonHome 添加到 virtualenv 的路径。 有关更多详细信息,请参阅 mod_wsgi virtualenv 指南

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

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

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

警告

如果多个 Django 站点在单个 mod_wsgi 进程中运行,则所有站点都将使用碰巧最先运行的站点的设置。 这可以通过更改来解决:

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 配置为接受非 ASCII 文件名:

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

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

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


使用 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 作为静态媒体提供,而其他使用 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>

如果您使用的 Apache 版本早于 2.4,请将 Require all granted 替换为 Allow from all,并在其上方添加行 Order deny,allow


服务后台文件

django.contrib.staticfiles:setting:`INSTALLED_APPS` 中时,Django 开发服务器会自动提供管理应用程序(以及任何其他已安装应用程序)的静态文件。 但是,当您使用任何其他服务器安排时,情况并非如此。 您负责设置 Apache 或您使用的任何 Web 服务器,以提供管理文件。

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

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

  1. 从您的文档根目录中创建一个指向管理静态文件的符号链接(这可能需要您的 Apache 配置中的 +FollowSymLinks)。
  2. 使用 Alias 指令,如上所示,将适当的 URL(可能是 :setting:`STATIC_URL` + admin/)别名到管理文件的实际位置。
  3. 直接将后台静态文件拷贝至 Apache 的文档根目录。


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

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