如何使用 Apache 和 mod_wsgi 托管 Django

利用 Apache mod_wsgi 在生产环境部署已经过充分测试。

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 1 内为应用安装项目的 Python 依赖,将该 virtualenv 的路径添加至 WSGIPythonHome 。参考 mod_wsgi virtualenv guide 指南获取更多细节。

WSGIPythonPath 行确保你的项目包能从 Python path 导入;换句话说, import mysite 能正常工作。

1 片段确保 Apache 能访问文件 wsgi.py 文件。

下一步,我们需要确认 wsgi.py 文件包含一个 WSGI 应用对象。从 Django 1.4 起, startproject 会自动创建;换而言之,你无需手动创建。查阅 WSGI 概述文档 获取你需要配置的默认内容,以及其它可配置项。

Warning

如果多个 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 配置支持UTF-8编码:

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

常见的配置文件路径是 /etc/apache2/envvars

或者,如果你正在 使用 mod_wsgi 守护进程模式,你可以在 WSGIDaemonProcess 指令中添加 langlocale 选项:

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

参考 Unicode 参考指引的 文件 章节获取细节信息。

使用 mod_wsgi 后台模式

"Daemon mode" 是运行 mod_wsgi 的推荐模式(在非 Windows 平台上)。为了创建必要的后台进程组并在其中运行 Django 实例,你需要添加合适的 WSGIDaemonProcessWSGIProcessGroup 指令。上述配置在你使用后台模式时需要点小修改,即你不能使用 WSGIPythonPath;作为替换,你要在 WSGIDaemonProcess 中添加 python-path 选项,例如:

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 服务器——即一个不同时运行 Django 的服务器——来提供媒体服务。这里有一些不错的选择。

  • Nginx

  • 一个 Apache 的朴素版本

  • 然而,若你别无选择,只能在与 Django 相同的 Apache VirtualHost 上提供媒体文件,你可以让 Apache 为一些 URL 提供静态媒体服务,其它的用 mod_wsgi 接口传递给 Django。

    本例在站点根目录配置 Django,但以静态文件的形式提供 robots.txtfavicon.ico 以及 /static//media/ 中的内容。其它所有 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.staticfilesINSTALLED_APPS 中时,Django 开发服务器会自动提供管理应用程序(以及其他任何已安装的应用程序)的静态文件。然而,当你使用任何其他服务器安排时,情况就不是这样了。你要负责设置 Apache 或你所使用的任何网络服务器,以提供管理文件。

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

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

  • 在文档根目录中创建一个指向后台静态文件的符号链接(Apache 配置中可能要添加 +FollowSymLinks)。

  • 使用前文介绍的 Alias 指令,为合适的 URL (可能是 STATIC_URL + admin/) 取个别名,指向后台文件的实际位置。

  • 直接将后台静态文件拷贝至 Apache 的文档根目录。

  • Apache 利用 Django 的用户数据库进行验证

    Django 提供了一个处理器,允许 Apache 直接用 Django 的认证授权后端认证用户。参考文档 mod_wsgi 认证授权文档

  • JetBrains
  • JetBrains delivers intelligent software solutions that make developers more productive by simplifying their challenging tasks, automating the routine, and helping them adopt the best development practices. PyCharm is the Python IDE for Professional Developers by JetBrains providing a complete set of tools for productive Python, Web and scientific development.
  • Kraken Tech
  • Kraken is the most-loved operating system for energy. Powered by our Utility-Grade AI™ and deep industry know-how, we help utilities transform their technology and operations so they can lead the energy transition. Delivering better outcomes from generation through distribution to supply, Kraken powers 70+ million accounts worldwide, and is on a mission to make a big, green dent in the universe.