“Django/docs/2.2.x/howto/deployment/checklist”的版本间差异
(autoload) |
小 (Page commit) |
||
第1行: | 第1行: | ||
+ | {{DISPLAYTITLE:部署清单 — Django 文档}} | ||
<div id="deployment-checklist" class="section"> | <div id="deployment-checklist" class="section"> | ||
= 部署清单 = | = 部署清单 = | ||
− | + | 互联网是一个充满敌意的环境。 在部署 Django 项目之前,您应该花一些时间检查您的设置,并考虑到安全性、性能和操作。 | |
− | Django | + | Django 包括许多 [[../../../topics/security|安全特性]] 。 有些是内置的并且始终启用。 其他是可选的,因为它们并不总是合适的,或者因为它们不便于开发。 例如,强制HTTPS可能并不适合所有网站,对于本地开发是不切实际的。 |
− | + | 性能优化是另一类与便利性的权衡。 例如,缓存在生产中很有用,而在本地开发中则不然。 错误报告需求也大不相同。 | |
以下清单包括以下配置: | 以下清单包括以下配置: | ||
第17行: | 第18行: | ||
* 提供错误报告功能。 | * 提供错误报告功能。 | ||
− | + | 其中许多设置是敏感的,应视为机密。 如果您要发布项目的源代码,通常的做法是发布合适的开发设置,并使用私有设置模块进行生产。 | |
<div id="run-manage-py-check-deploy" class="section"> | <div id="run-manage-py-check-deploy" class="section"> | ||
− | == 运行 | + | == 运行 manage.py check --deploy == |
− | + | 下面描述的一些检查可以使用 <code>check --deploy</code> 选项自动进行。 请务必按照选项文档中的说明针对您的生产设置文件运行它。 | |
第31行: | 第32行: | ||
== 关键配置 == | == 关键配置 == | ||
− | <div id="secret-key" class="section"> | + | <div id="setting-secret-key" class="section"> |
− | === | + | === :setting:`SECRET_KEY` === |
− | ''' | + | '''密钥必须是一个很大的随机值,并且必须保密。''' |
− | + | 确保生产中使用的密钥未在其他任何地方使用,并避免将其提交给源代码控制。 这减少了攻击者可以从中获取密钥的向量的数量。 | |
− | + | 与其在设置模块中对密钥进行硬编码,不如考虑从环境变量中加载它: | |
<div class="highlight-default notranslate"> | <div class="highlight-default notranslate"> | ||
第45行: | 第46行: | ||
<div class="highlight"> | <div class="highlight"> | ||
− | < | + | <syntaxhighlight lang="python">import os |
− | SECRET_KEY = os.environ['SECRET_KEY']</ | + | SECRET_KEY = os.environ['SECRET_KEY']</syntaxhighlight> |
</div> | </div> | ||
</div> | </div> | ||
− | + | 或从文件: | |
<div class="highlight-default notranslate"> | <div class="highlight-default notranslate"> | ||
第57行: | 第58行: | ||
<div class="highlight"> | <div class="highlight"> | ||
− | < | + | <syntaxhighlight lang="python">with open('/etc/secret_key.txt') as f: |
− | SECRET_KEY = f.read().strip()</ | + | SECRET_KEY = f.read().strip()</syntaxhighlight> |
</div> | </div> | ||
第65行: | 第66行: | ||
</div> | </div> | ||
− | <div id="debug" class="section"> | + | <div id="setting-debug" class="section"> |
− | === | + | === :setting:`DEBUG` === |
− | ''' | + | '''您绝不能在生产中启用调试。''' |
− | + | 你肯定正在开发你的项目 [[#id5|:设置:`调试=真 `]] ,因为这可以启用浏览器中的完整追溯等方便的功能。 | |
不过,对于生产环境来说,这真是一个坏主意,因为这会泄露很多超出预期的信息:代码摘要,本地变量,配置项,使用的库,等等。 | 不过,对于生产环境来说,这真是一个坏主意,因为这会泄露很多超出预期的信息:代码摘要,本地变量,配置项,使用的库,等等。 | ||
第83行: | 第84行: | ||
== 特定于环境的配置 == | == 特定于环境的配置 == | ||
− | <div id="allowed-hosts" class="section"> | + | <div id="setting-allowed-hosts" class="section"> |
− | === | + | === :setting:`ALLOWED_HOSTS` === |
− | [[ | + | 什么时候 [[#id9|:设置:`调试=假 `]] , 如果没有合适的值,Django 根本无法工作 [[#id11|:设置:`ALLOWED_HOSTS`]] . |
− | + | 需要此设置来保护您的站点免受某些 CSRF 攻击。 如果您使用通配符,您必须自己验证 <code>Host</code> HTTP 标头,否则确保您不易受到此类攻击。 | |
− | + | 您还应该配置位于 Django 前面的 Web 服务器来验证主机。 它应该以静态错误页面响应或忽略对不正确主机的请求,而不是将请求转发给 Django。 通过这种方式,您将避免 Django 日志(或电子邮件,如果您以这种方式配置错误报告)中的虚假错误。 例如,在 nginx 上,您可能会设置一个默认服务器以在无法识别的主机上返回“444 No Response”: | |
<div class="highlight-nginx notranslate"> | <div class="highlight-nginx notranslate"> | ||
第97行: | 第98行: | ||
<div class="highlight"> | <div class="highlight"> | ||
− | < | + | <syntaxhighlight lang="nginx">server { |
listen 80 default_server; | listen 80 default_server; | ||
return 444; | return 444; | ||
− | }</ | + | }</syntaxhighlight> |
</div> | </div> | ||
第107行: | 第108行: | ||
</div> | </div> | ||
− | <div id="caches" class="section"> | + | <div id="setting-caches" class="section"> |
− | === | + | === :setting:`CACHES` === |
− | + | 如果您使用缓存,则开发和生产中的连接参数可能不同。 Django 默认为每个进程 [[../../../topics/cache#local-memory-caching|本地内存缓存]] 这可能是不可取的。 | |
− | + | 缓存服务器通常具有弱身份验证。 确保它们只接受来自您的应用程序服务器的连接。 | |
− | + | 如果您使用的是 Memcached,请考虑使用 [[../../../topics/http/sessions#cached-sessions-backend|缓存会话]] 来提高性能。 | |
</div> | </div> | ||
− | <div id="databases" class="section"> | + | <div id="setting-databases" class="section"> |
− | === | + | === :setting:`DATABASES` === |
生产环境与开发环境的数据库连接参数可能是不同的。 | 生产环境与开发环境的数据库连接参数可能是不同的。 | ||
− | + | 数据库密码非常敏感。 你应该像 [[#id17|:setting:`SECRET_KEY`]] 一样保护它们。 | |
为了最大限度的安全,确保数据库只为来自你应用的连接提供服务。 | 为了最大限度的安全,确保数据库只为来自你应用的连接提供服务。 | ||
− | + | 如果您尚未为数据库设置备份,请立即进行! | |
</div> | </div> | ||
− | <div id="email-backend-and-related-settings" class="section"> | + | <div id="setting-email-backend-and-related-settings" class="section"> |
− | === | + | === :setting:`EMAIL_BACKEND` 及相关设置 === |
如果你的站点发送邮件,以下值需要被正确地配置。 | 如果你的站点发送邮件,以下值需要被正确地配置。 | ||
− | 默认情况下,Django 从 [mailto:webmaster%40localhost webmaster | + | 默认情况下,Django 从 [mailto:webmaster%40localhost webmaster@localhost] 和 [mailto:root%40localhost root@localhost] 发送电子邮件。 但是,某些邮件提供商拒绝来自这些地址的电子邮件。 要使用不同的发件人地址,请修改 [[#id21|:setting:`DEFAULT_FROM_EMAIL`]] 和 [[#id23|:setting:`SERVER_EMAIL`]] 设置。 |
</div> | </div> | ||
− | <div id="static-root-and-static-url" class="section"> | + | <div id="setting-static-root-and-setting-static-url" class="section"> |
− | === | + | === :setting:`STATIC_ROOT` 和 :setting:`STATIC_URL` === |
− | + | 静态文件由开发服务器自动提供。 在生产中,您必须定义一个 [[#id29|:setting:`STATIC_ROOT`]] 目录,其中 [[#id31|:djadmin:`collectstatic`]] 将复制它们。 | |
− | + | 看管理静态文件(例如 图片、JavaScript、CSS) 想要查询更多的信息。 | |
</div> | </div> | ||
− | <div id="media-root-and-media-url" class="section"> | + | <div id="setting-media-root-and-setting-media-url" class="section"> |
− | === | + | === :setting:`MEDIA_ROOT` 和 :setting:`MEDIA_URL` === |
− | + | 媒体文件由您的用户上传。 他们不受信任! 确保您的 Web 服务器从不尝试解释它们。 例如,如果用户上传 <code>.php</code> 文件,Web 服务器不应执行它。 | |
现在是检查这些文件的备份策略的好时机。 | 现在是检查这些文件的备份策略的好时机。 | ||
第163行: | 第164行: | ||
</div> | </div> | ||
− | <div id="file-upload-permissions" class="section"> | + | <div id="setting-file-upload-permissions" class="section"> |
− | === | + | === :setting:`FILE_UPLOAD_PERMISSIONS` === |
− | + | 使用默认文件上传设置,小于 [[#id39|:setting:`FILE_UPLOAD_MAX_MEMORY_SIZE`]] 的文件可能以不同于 [[#id41|:setting:`FILE_UPLOAD_PERMISSIONS`]] 中所述的较大文件的模式存储。 | |
− | + | 设置 [[#id43|:setting:`FILE_UPLOAD_PERMISSIONS`]] 确保所有文件都以相同的权限上传。 | |
第179行: | 第180行: | ||
== HTTPS == | == HTTPS == | ||
− | + | 任何允许用户登录的网站都应强制执行站点范围的 HTTPS,以避免以明文形式传输访问令牌。 在 Django 中,访问令牌包括登录名/密码、会话 cookie 和密码重置令牌。 (如果您通过电子邮件发送密码重置令牌,您将无能为力。) | |
− | + | 保护用户帐户或管理员等敏感区域是不够的,因为 HTTP 和 HTTPS 使用相同的会话 cookie。 您的 Web 服务器必须将所有 HTTP 流量重定向到 HTTPS,并且只将 HTTPS 请求传输到 Django。 | |
− | + | 设置 HTTPS 后,请启用以下设置。 | |
− | <div id="csrf-cookie-secure" class="section"> | + | <div id="setting-csrf-cookie-secure" class="section"> |
− | === | + | === :setting:`CSRF_COOKIE_SECURE` === |
− | 将此设置为 <code>True</code> | + | 将此设置为 <code>True</code> 以避免意外通过 HTTP 传输 CSRF cookie。 |
</div> | </div> | ||
− | <div id="session-cookie-secure" class="section"> | + | <div id="setting-session-cookie-secure" class="section"> |
− | === | + | === :setting:`SESSION_COOKIE_SECURE` === |
− | + | 将此设置为 <code>True</code> 以避免意外通过 HTTP 传输会话 cookie。 | |
第207行: | 第208行: | ||
== 性能优化 == | == 性能优化 == | ||
− | + | 环境 [[#id49|:设置:`调试=假 `]] 禁用仅在开发中有用的几个功能。 此外,您可以调整以下设置。 | |
− | <div id="conn-max-age" class="section"> | + | <div id="setting-conn-max-age" class="section"> |
− | === | + | === :setting:`CONN_MAX_AGE` === |
− | + | 当连接到数据库占请求处理时间的很大一部分时,启用 [[../../../ref/databases#persistent-database-connections|持久数据库连接]] 可以导致很好的加速。 | |
这对带宽有限的虚拟主机帮助极大。 | 这对带宽有限的虚拟主机帮助极大。 | ||
第219行: | 第220行: | ||
</div> | </div> | ||
− | <div id="templates" class="section"> | + | <div id="setting-templates" class="section"> |
− | === | + | === :setting:`TEMPLATES` === |
− | + | 启用缓存模板加载器通常会显着提高性能,因为它避免了每次需要渲染时都编译每个模板。 有关更多信息,请参阅 [[../../../ref/templates/api#template-loaders|模板加载器文档]] 。 | |
第233行: | 第234行: | ||
== 发送错误 == | == 发送错误 == | ||
− | + | 当您将代码投入生产时,它有望变得健壮,但您不能排除意外错误。 幸运的是,Django 可以捕获错误并相应地通知您。 | |
− | <div id="logging" class="section"> | + | <div id="setting-logging" class="section"> |
− | === | + | === :setting:`LOGGING` === |
在将网站放入生产环境前,检查 logging 配置项。在你收到某些信息后,查看其是否按预期运行。 | 在将网站放入生产环境前,检查 logging 配置项。在你收到某些信息后,查看其是否按预期运行。 | ||
− | + | 有关日志记录的详细信息,请参阅 [[../../../topics/logging|日志记录]] 。 | |
</div> | </div> | ||
− | <div id="admins-and-managers" class="section"> | + | <div id="setting-admins-and-setting-managers" class="section"> |
− | === | + | === :setting:`ADMINS` 和 :setting:`MANAGERS` === |
− | + | [[#id61|:setting:`ADMINS`]] 将通过电子邮件通知 500 个错误。 | |
− | + | [[#id63|:setting:`MANAGERS`]] 将收到 404 错误通知。 [[#id65|:setting:`IGNORABLE_404_URLS`]] 可以帮助过滤掉虚假报告。 | |
− | + | 有关通过电子邮件报告错误的详细信息,请参阅 [[../../error-reporting|错误报告]] 。 | |
<div class="admonition-error-reporting-by-email-doesn-t-scale-very-well admonition"> | <div class="admonition-error-reporting-by-email-doesn-t-scale-very-well admonition"> | ||
− | + | 通过电子邮件报告错误不能很好地扩展 | |
− | + | 在您的收件箱被报告淹没之前,请考虑使用错误监控系统,例如 [https://docs.sentry.io/ Sentry]。 Sentry 还可以聚合日志。 | |
第269行: | 第270行: | ||
=== 自定义默认错误视图 === | === 自定义默认错误视图 === | ||
− | Django | + | Django 包括几个 HTTP 错误代码的默认视图和模板。 您可能希望通过在根模板目录中创建以下模板来覆盖默认模板:<code>404.html</code>、<code>500.html</code>、<code>403.html</code> 和 <code>400.html</code>。 使用这些模板的 [[../../../ref/views#error-views|默认错误视图]] 应该足以满足 99% of Web 应用程序的需求,但您也可以 [[../../../topics/http/views#customizing-error-views|自定义它们]] 。 |
第277行: | 第278行: | ||
</div> | </div> | ||
+ | <div class="clearer"> | ||
− | [[Category:Django 2.2.x | + | |
+ | |||
+ | </div> | ||
+ | |||
+ | [[Category:Django 2.2.x 文档]] |
2021年10月31日 (日) 04:04的最新版本
部署清单
互联网是一个充满敌意的环境。 在部署 Django 项目之前,您应该花一些时间检查您的设置,并考虑到安全性、性能和操作。
Django 包括许多 安全特性 。 有些是内置的并且始终启用。 其他是可选的,因为它们并不总是合适的,或者因为它们不便于开发。 例如,强制HTTPS可能并不适合所有网站,对于本地开发是不切实际的。
性能优化是另一类与便利性的权衡。 例如,缓存在生产中很有用,而在本地开发中则不然。 错误报告需求也大不相同。
以下清单包括以下配置:
- 必须正确地设置 Django 以提供预期的安全级别;
- 期望在每个环境中都是不同的;
- 启用可选的安全功能;
- 启用性能优化;
- 提供错误报告功能。
其中许多设置是敏感的,应视为机密。 如果您要发布项目的源代码,通常的做法是发布合适的开发设置,并使用私有设置模块进行生产。
运行 manage.py check --deploy
下面描述的一些检查可以使用 check --deploy
选项自动进行。 请务必按照选项文档中的说明针对您的生产设置文件运行它。
关键配置
:setting:`SECRET_KEY`
密钥必须是一个很大的随机值,并且必须保密。
确保生产中使用的密钥未在其他任何地方使用,并避免将其提交给源代码控制。 这减少了攻击者可以从中获取密钥的向量的数量。
与其在设置模块中对密钥进行硬编码,不如考虑从环境变量中加载它:
或从文件:
:setting:`DEBUG`
您绝不能在生产中启用调试。
你肯定正在开发你的项目 :设置:`调试=真 ` ,因为这可以启用浏览器中的完整追溯等方便的功能。
不过,对于生产环境来说,这真是一个坏主意,因为这会泄露很多超出预期的信息:代码摘要,本地变量,配置项,使用的库,等等。
特定于环境的配置
:setting:`ALLOWED_HOSTS`
什么时候 :设置:`调试=假 ` , 如果没有合适的值,Django 根本无法工作 :设置:`ALLOWED_HOSTS` .
需要此设置来保护您的站点免受某些 CSRF 攻击。 如果您使用通配符,您必须自己验证 Host
HTTP 标头,否则确保您不易受到此类攻击。
您还应该配置位于 Django 前面的 Web 服务器来验证主机。 它应该以静态错误页面响应或忽略对不正确主机的请求,而不是将请求转发给 Django。 通过这种方式,您将避免 Django 日志(或电子邮件,如果您以这种方式配置错误报告)中的虚假错误。 例如,在 nginx 上,您可能会设置一个默认服务器以在无法识别的主机上返回“444 No Response”:
:setting:`CACHES`
如果您使用缓存,则开发和生产中的连接参数可能不同。 Django 默认为每个进程 本地内存缓存 这可能是不可取的。
缓存服务器通常具有弱身份验证。 确保它们只接受来自您的应用程序服务器的连接。
如果您使用的是 Memcached,请考虑使用 缓存会话 来提高性能。
:setting:`DATABASES`
生产环境与开发环境的数据库连接参数可能是不同的。
数据库密码非常敏感。 你应该像 :setting:`SECRET_KEY` 一样保护它们。
为了最大限度的安全,确保数据库只为来自你应用的连接提供服务。
如果您尚未为数据库设置备份,请立即进行!
:setting:`STATIC_ROOT` 和 :setting:`STATIC_URL`
静态文件由开发服务器自动提供。 在生产中,您必须定义一个 :setting:`STATIC_ROOT` 目录,其中 :djadmin:`collectstatic` 将复制它们。
看管理静态文件(例如 图片、JavaScript、CSS) 想要查询更多的信息。
:setting:`MEDIA_ROOT` 和 :setting:`MEDIA_URL`
媒体文件由您的用户上传。 他们不受信任! 确保您的 Web 服务器从不尝试解释它们。 例如,如果用户上传 .php
文件,Web 服务器不应执行它。
现在是检查这些文件的备份策略的好时机。
:setting:`FILE_UPLOAD_PERMISSIONS`
使用默认文件上传设置,小于 :setting:`FILE_UPLOAD_MAX_MEMORY_SIZE` 的文件可能以不同于 :setting:`FILE_UPLOAD_PERMISSIONS` 中所述的较大文件的模式存储。
设置 :setting:`FILE_UPLOAD_PERMISSIONS` 确保所有文件都以相同的权限上传。
HTTPS
任何允许用户登录的网站都应强制执行站点范围的 HTTPS,以避免以明文形式传输访问令牌。 在 Django 中,访问令牌包括登录名/密码、会话 cookie 和密码重置令牌。 (如果您通过电子邮件发送密码重置令牌,您将无能为力。)
保护用户帐户或管理员等敏感区域是不够的,因为 HTTP 和 HTTPS 使用相同的会话 cookie。 您的 Web 服务器必须将所有 HTTP 流量重定向到 HTTPS,并且只将 HTTPS 请求传输到 Django。
设置 HTTPS 后,请启用以下设置。
性能优化
环境 :设置:`调试=假 ` 禁用仅在开发中有用的几个功能。 此外,您可以调整以下设置。
发送错误
当您将代码投入生产时,它有望变得健壮,但您不能排除意外错误。 幸运的是,Django 可以捕获错误并相应地通知您。
:setting:`ADMINS` 和 :setting:`MANAGERS`
:setting:`ADMINS` 将通过电子邮件通知 500 个错误。
:setting:`MANAGERS` 将收到 404 错误通知。 :setting:`IGNORABLE_404_URLS` 可以帮助过滤掉虚假报告。
有关通过电子邮件报告错误的详细信息,请参阅 错误报告 。