部署检查表

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

Django包括很多 security features . 有些是内置的,并且始终启用。其他选项是可选的,因为它们并不总是合适的,或者因为它们不方便开发。例如,强制HTTPS可能不适用于所有网站,并且对于本地开发来说是不现实的。

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

以下检查表包括以下设置:

  • 必须为Django适当设置,以提供预期的安全水平;

  • 在每个环境中都是不同的;

  • 启用可选的安全功能;

  • 启用性能优化;

  • 提供错误报告。

其中许多设置都是敏感的,应视为机密。如果要发布项目的源代码,通常的做法是发布适合开发的设置,并使用私有设置模块进行生产。

运行 manage.py check --deploy

下面介绍的一些检查可以使用 check --deploy 选择权。请确保按照选项文档中的描述,对生产设置文件运行它。

关键设置

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 ,没有合适的值,django根本无法工作 ALLOWED_HOSTS .

此设置是保护您的站点免受某些CSRF攻击所必需的。如果使用通配符,则必须对 Host HTTP头,或者确保您不易受到此类攻击。

您还应该配置位于Django前面的Web服务器以验证主机。它应该以静态错误页面响应,或者忽略对不正确主机的请求,而不是将请求转发给Django。这样,您将避免在Django日志中出现虚假错误(或电子邮件,如果您以这种方式配置了错误报告)。例如,在nginx上,您可以将默认服务器设置为在无法识别的主机上返回“444 No Response”:

server {
    listen 80 default_server;
    return 444;
}

CACHES

如果您使用的是缓存,那么在开发和生产中连接参数可能会有所不同。Django默认为每个进程 local-memory caching 这可能是不可取的。

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

DATABASES

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

数据库密码非常敏感。你应该像保护他们一样保护他们 SECRET_KEY .

为了获得最大的安全性,请确保数据库服务器只接受来自应用程序服务器的连接。

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

STATIC_ROOT and STATIC_URL

静态文件由开发服务器自动提供服务。在生产中,必须定义 STATIC_ROOT 目录在哪里 collectstatic 将复制它们。

如何管理静态文件(如图像、JavaScript、css) 更多信息。

MEDIA_ROOT and MEDIA_URL

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

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

HTTPS

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

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

设置完https后,启用以下设置。

性能优化

设置 DEBUG = False 禁用仅在开发中有用的几个功能。此外,您还可以调整以下设置。

会议

考虑使用 cached sessions 以提高性能。

如果使用数据库支持的会话,则定期 clear old sessions 以避免存储不必要的数据。

CONN_MAX_AGE

有可能 persistent database connections 在很大一部分请求处理时间内,当连接到数据库帐户时会导致很快的速度。

这对网络性能有限的虚拟主机有很大帮助。

TEMPLATES

启用缓存模板加载器通常会显著提高性能,因为它避免了每次需要呈现每个模板时都对其进行编译。什么时候 DEBUG = False ,则会自动启用缓存模板加载器。看见 django.template.loaders.cached.Loader 以获取更多信息。

错误报告

当您将代码推送到生产环境时,希望它是健壮的,但是您不能排除意外的错误。谢天谢地,Django可以捕获错误并相应地通知您。

LOGGING

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

登录 有关日志记录的详细信息。

ADMINS and MANAGERS

ADMINS 将通过电子邮件通知500个错误。

MANAGERS 将收到404个错误的通知。 IGNORABLE_404_URLS 有助于过滤虚假报告。

如何管理错误报告 有关通过电子邮件报告错误的详细信息。

电子邮件错误报告的扩展性不太好

考虑使用错误监视系统,例如 Sentry 在你的收件箱被报告淹没之前。哨兵也可以收集原木。

自定义默认错误视图

Django包括几个HTTP错误代码的默认视图和模板。您可能希望通过在根模板目录中创建以下模板来覆盖默认模板: 404.html500.html403.html ,以及 400.html 。这个 default error views 使用这些模板应该可以满足99%的Web应用程序的需求,但您可以 customize them 也是。