部署静态文件

在生产环境提供静态文件服务

在生产环境部署静态文件的基础要点有两步:在静态文件变化时,运行 collectstatic,然后将已收集的静态文件目录配置(STATIC_ROOT)移至静态文件服务器并提供服务。 STATICFILES_STORAGE 配置可能会要求手动将文件移动到新位置,不过 Storage 类的 post_process 方法可能会处理它。

像所有的部署任务一样,细节决定成败。每个生成环境的配置可能都有点不同个,所以,需要调整基础配置以满足你的需求。以下是常见模式,可能对你有所帮助。

在同一服务器提供站点和静态文件服务

如果你想在早已提供站点服务器服务器上同时提供静态文件服务,操作步骤类似这样:

你可能期望将该流程自动化,特别是在你有好几个 web 服务器的时候。

专用服务器提供静态文件服务

大多数大型 Django 站点使用一个独立的 Web 服务器——即,该服务器并未运行 Django,值提供静态文件服务。这种服务器一般运行一种不同的 Web 服务器——更快,更简单。常见选项如下:

如何配置这些服务器超出了本文范围;查阅这些服务器各自的文档获取介绍。

由于静态文件服务器并不运行 Django,你需要将部署策略改成这样:

  • 当静态文件改变时,本地运行 collectstatic
  • 将本地 STATIC_ROOT 推送到静态文件服务器提供服务的目录。 rsync 是一个常见选项,因为这种配置只会传输文件修改部分的数据流。

从云服务或 CDN 提供静态文件服务

另一种常见的策略是从类似亚马逊 S3 的云存储服务商或 CDN (content delivery network) 提供静态文件服务。这能让你忽略提供静态文件服务可能出现的问题,提供 Web 页面加载速度(尤其是在用 CDN 的时候)。

使用这些服务时,基本的工作流程与上面类似,除了要将静态文件传输给存储服务商或 CDN,而不是用 rsync 将静态文件传输给服务器。

有很多中方法可以实现目的,但是若服务商提供一个 API,你可以使用一个 自定义文件储存后端 将自定义 CDN 文件后端集成到你的 Django 项目中。若你已编写或正在使用第三方的自定义存储后端,你可以通过配置 STATICFILES_STORAGE 配置指向该存储引擎告诉 collectstatic 启用它。

例如,若你已在 myproject.storage.S3Storage 中写了一个 S3 存储后端,可以这么用:

STATICFILES_STORAGE = 'myproject.storage.S3Storage'

只要完成了上述流程,你就只需运行 collectstatic,静态文件将通过存储包推送给 S3。如果稍后需要切换至另一个存储服务商,你可能只需简单地修改配置 STATICFILES_STORAGE 配置。

关于如何编写这些后端的细节,参考 编写一个自定义存储系统。有很多可用的第三方应用提供了针对常见文件存储 API 的存储后端。 djangopackages.org 入门 是个不错的起点。

了解更多

想要了解所有配置项,命令,模板标签和 django.contrib.staticfiles 包含的其它零碎的完整细节,参考 staticfiles 参考