Skip to main content

部署清单

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

Django包括许多 安全功能。有些是内置的,总是启用。其他是可选的,因为它们不总是适当的,或者因为它们不便于开发。例如,强制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()

DEBUG

您不能在生产中启用调试。

你肯定是使用 DEBUG = True 开发项目,因为这样可以在浏览器中实现完整的跟踪功能等便利功能。

对于生产环境,这是一个很糟糕的想法,因为它泄漏了很多关于你的项目的信息:摘录你的源代码,局部变量,设置,使用的库等。

环境特定设置

ALLOWED_HOSTS

DEBUG = False,Django根本没有合适的值为 ALLOWED_HOSTS 工作。

需要此设置才能保护您的站点免受某些CSRF攻击。如果使用通配符,则必须对 Host HTTP头进行自己的验证,否则请确保您不易受此类攻击的攻击。

您还应该配置位于Django前面的Web服务器来验证主机。它应该响应静态错误页面或忽略对不正确的主机的请求,而不是转发请求到Django。这样,你可以避免在你的Django日志(或电子邮件,如果你有错误报告配置这样)的虚假错误。例如,在nginx上,您可能会设置一个默认服务器,以在无法识别的主机上返回“444无响应”:

server {
    listen 80 default_server;
    return 444;
}

CACHES

如果您使用缓存,连接参数可能在开发和生产中有所不同。 Django默认为每进程 本地内存缓存,这可能是不可取的。

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

如果您使用Memcached,请考虑使用 缓存会话 来提高性能。

DATABASES

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

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

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

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

STATIC_ROOTSTATIC_URL

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

有关详细信息,请参阅 管理静态文件(例如图片,JavaScript,CSS)

MEDIA_ROOTMEDIA_URL

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

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

HTTPS

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

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

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

性能优化

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

CONN_MAX_AGE

启用 持久性数据库连接 可以在连接到数据库帐户时占据请求处理时间的很大一部分,从而可以提高速度。

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

TEMPLATES

启用缓存模板加载器通常会大幅提高性能,因为它避免在每次需要渲染时编译每个模板。有关详细信息,请参阅 模板加载程序文档

报告错误

当你把你的代码推向生产,它希望是强大的,但你不能排除意外的错误。值得庆幸的是,Django可以捕获错误并相应地通知您。

LOGGING

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

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

ADMINSMANAGERS

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

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

有关通过电子邮件报告错误的详细信息,请参阅 报告错误

通过电子邮件报告错误不能很好地缩放

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

自定义默认错误视图

Django包括多个HTTP错误代码的默认视图和模板。您可能想要覆盖默认模板,方法是在根模板目录中创建以下模板:404.html500.html403.html400.html。默认视图应满足99%的Web应用程序,但如果您希望自定义它们,请参阅这些说明,其中还包含有关默认模板的详细信息:

Python选项

强烈建议您使用 -R 选项或将 PYTHONHASHSEED 环境变量设置为 random 来调用运行Django应用程序的Python进程。默认情况下启用此选项,从Python 3.3开始。

这些选项有助于保护您的网站免受由精心设计的输入触发的拒绝服务(DoS)攻击。这样的攻击可以通过在创建 dict 实例时产生最坏情况性能来显着增加CPU使用率。有关详细信息,请参阅 oCERT咨询#2011-003