部署清单

互联网是一个充满敌意的环境。在部署您的 Django 项目之前,您应该花一些时间审查您的设置,并牢记安全、性能和操作。

Django 包含许多 安全特性。有些是内置的,并且始终启用。其他是可选的,因为它们并不总是适用,或者因为它们对开发来说不方便。例如,强制使用 HTTPS 可能不适合所有网站,并且对于本地开发来说是不切实际的。

性能优化是另一类与便利性权衡的类别。例如,缓存在生产环境中很有用,而在本地开发环境中则不那么有用。错误报告的需求也大不相同。

以下清单包括以下设置

  • 必须正确设置才能使 Django 提供预期的安全级别;

  • 预计在每个环境中都会有所不同;

  • 启用可选的安全特性;

  • 启用性能优化;

  • 提供错误报告。

许多这些设置都很敏感,应视为机密信息。如果您要发布项目的源代码,一种常见做法是发布适合开发的设置,并使用私有设置模块进行生产。

运行 manage.py check --deploy

下面描述的一些检查可以使用 check --deploy 选项自动执行。请务必根据该选项文档中所述针对您的生产设置文件运行它。

停止使用 manage.py runserver

runserver 命令并非设计用于生产环境。请务必切换到生产就绪的 WSGI 或 ASGI 服务器。有关一些常见选项,请参阅 WSGI 服务器ASGI 服务器

关键设置

SECRET_KEY

密钥必须是一个大的随机值,并且必须保密。

确保生产中使用的密钥在其他任何地方都没有使用,并避免将其提交到源代码控制中。这减少了攻击者获取密钥的途径数量。

不要在设置模块中硬编码密钥,而是考虑从环境变量

import os

SECRET_KEY = os.environ["SECRET_KEY"]

或从文件中加载它

with open("/etc/secret_key.txt") as f:
    SECRET_KEY = f.read().strip()

如果轮换密钥,您可以使用 SECRET_KEY_FALLBACKS

import os

SECRET_KEY = os.environ["CURRENT_SECRET_KEY"]
SECRET_KEY_FALLBACKS = [
    os.environ["OLD_SECRET_KEY"],
]

确保及时从 SECRET_KEY_FALLBACKS 中删除旧密钥。

DEBUG

您绝不能在生产环境中启用调试模式。

您肯定是在使用 DEBUG = True 开发您的项目,因为这启用了诸如在浏览器中显示完整回溯之类的便捷功能。

但是,对于生产环境,这是一个非常糟糕的主意,因为它泄露了有关您项目的许多信息:您的源代码片段、局部变量、设置、使用的库等。

特定于环境的设置

ALLOWED_HOSTS

DEBUG = False 时,如果没有 ALLOWED_HOSTS 的合适值,Django 根本无法工作。

此设置是保护您的网站免受某些 CSRF 攻击所必需的。如果您使用通配符,则必须自行验证 Host HTTP 标头,或以其他方式确保您不受此类攻击的影响。

您还应该配置位于 Django 前面的 Web 服务器以验证主机。它应该使用静态错误页面进行响应,或者忽略对不正确主机 的请求,而不是将请求转发到 Django。这样,您就可以避免 Django 日志中出现无意义的错误(或者如果您已配置了错误报告,则避免电子邮件中出现错误)。例如,在 nginx 上,您可以设置一个默认服务器,以便在无法识别的主机上返回“444 无响应”

server {
    listen 80 default_server;
    return 444;
}

CACHES

如果您正在使用缓存,则开发和生产环境中的连接参数可能不同。Django 默认使用每个进程的 本地内存缓存,这可能不理想。

缓存服务器通常具有弱身份验证。确保它们仅接受来自应用程序服务器的连接。

DATABASES

数据库连接参数在开发和生产环境中可能不同。

数据库密码非常敏感。您应该像保护 SECRET_KEY 一样保护它们。

为了最大限度地提高安全性,请确保数据库服务器仅接受来自应用程序服务器的连接。

如果您尚未为数据库设置备份,请立即设置!

STATIC_ROOTSTATIC_URL

静态文件由开发服务器自动提供服务。在生产环境中,您必须定义一个 STATIC_ROOT 目录,collectstatic 将把文件复制到该目录。

有关更多信息,请参阅 如何管理静态文件(例如图像、JavaScript、CSS)

MEDIA_ROOTMEDIA_URL

媒体文件由您的用户上传。它们不可信!确保您的 Web 服务器从不尝试解释它们。例如,如果用户上传了一个 .php 文件,Web 服务器不应该执行它。

现在是检查这些文件的备份策略的好时机。

HTTPS

任何允许用户登录的网站都应该强制执行站点范围的 HTTPS,以避免以明文形式传输访问令牌。在 Django 中,访问令牌包括登录/密码、会话 Cookie 和密码重置令牌。(如果您通过电子邮件发送密码重置令牌,则无法对其进行太多保护。)

保护用户帐户或管理员等敏感区域是不够的,因为相同的会话 Cookie 用于 HTTP 和 HTTPS。您的 Web 服务器必须将所有 HTTP 流量重定向到 HTTPS,并且仅将 HTTPS 请求传输到 Django。

设置 HTTPS 后,请启用以下设置。

性能优化

设置 DEBUG = False 将禁用开发中才需要的几个功能。此外,您可以调整以下设置。

会话

考虑使用 缓存会话 来提高性能。

如果使用数据库支持的会话,请定期 清除旧会话 以避免存储不必要的数据。

CONN_MAX_AGE

启用 持久数据库连接 可以带来显著的加速,尤其是在数据库连接占用了请求处理时间很大一部分的情况下。

这在网络性能有限的虚拟化主机上很有帮助。

TEMPLATES

启用缓存模板加载器通常可以大幅提高性能,因为它避免了每次渲染模板时都重新编译模板。当 DEBUG = False 时,缓存模板加载器会自动启用。有关更多信息,请参阅 django.template.loaders.cached.Loader

错误报告

在将代码推送到生产环境之前,希望它已经足够健壮,但您无法排除意外错误。幸运的是,Django 可以捕获错误并相应地通知您。

LOGGING

在将您的网站投入生产环境之前,请查看您的日志记录配置,并在收到一些流量后检查它是否按预期工作。

有关日志记录的详细信息,请参阅 日志记录

ADMINSMANAGERS

ADMINS 将通过电子邮件收到 500 错误的通知。

MANAGERS 将收到 404 错误的通知。 IGNORABLE_404_URLS 可以帮助过滤掉虚假报告。

有关通过电子邮件进行错误报告的详细信息,请参阅 如何管理错误报告

通过电子邮件进行错误报告的可扩展性不是很好。

在您的收件箱被报告淹没之前,请考虑使用错误监控系统(例如 Sentry)。Sentry 还可以聚合日志。

自定义默认错误视图

Django 包含几个 HTTP 错误代码的默认视图和模板。您可以通过在根模板目录中创建以下模板来覆盖默认模板:404.html500.html403.html400.html。使用这些模板的 默认错误视图 应该足以满足 99% 的 Web 应用程序,但您也可以 自定义它们

返回顶部