“Django/docs/2.2.x/howto/deployment/checklist”的版本间差异

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

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

确保生产中使用的密钥未在其他任何地方使用,并避免将其提交给源代码控制。 这减少了攻击者可以从中获取密钥的向量的数量。

与其在设置模块中对密钥进行硬编码,不如考虑从环境变量中加载它:

import os
SECRET_KEY = os.environ['SECRET_KEY']

或从文件:

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

:setting:`DEBUG`

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

你肯定正在开发你的项目 :设置:`调试=真 ` ,因为这可以启用浏览器中的完整追溯等方便的功能。

不过,对于生产环境来说,这真是一个坏主意,因为这会泄露很多超出预期的信息:代码摘要,本地变量,配置项,使用的库,等等。


特定于环境的配置

:setting:`ALLOWED_HOSTS`

什么时候 :设置:`调试=假 ` , 如果没有合适的值,Django 根本无法工作 :设置:`ALLOWED_HOSTS` .

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

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

server {
    listen 80 default_server;
    return 444;
}

: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 后,请启用以下设置。

性能优化

环境 :设置:`调试=假 ` 禁用仅在开发中有用的几个功能。 此外,您可以调整以下设置。

:setting:`CONN_MAX_AGE`

当连接到数据库占请求处理时间的很大一部分时,启用 持久数据库连接 可以导致很好的加速。

这对带宽有限的虚拟主机帮助极大。


:setting:`TEMPLATES`

启用缓存模板加载器通常会显着提高性能,因为它避免了每次需要渲染时都编译每个模板。 有关更多信息,请参阅 模板加载器文档


发送错误

当您将代码投入生产时,它有望变得健壮,但您不能排除意外错误。 幸运的是,Django 可以捕获错误并相应地通知您。

:setting:`LOGGING`

在将网站放入生产环境前,检查 logging 配置项。在你收到某些信息后,查看其是否按预期运行。

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


:setting:`ADMINS` 和 :setting:`MANAGERS`

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

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

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

通过电子邮件报告错误不能很好地扩展

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


自定义默认错误视图

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