如何部署静态文件¶
参见
想要 django.contrib.staticfiles
的使用指南,请参考 如何管理静态文件(如图片、JavaScript、CSS)。
在生产环境提供静态文件服务¶
将静态文件投入生产中的基本步骤包括两个步骤:当静态文件更改时运行 collectstatic
命令,然后安排将已收集的静态文件目录(STATIC_ROOT
)移动到静态文件服务器并提供服务。根据 staticfiles
STORAGES
别名,文件可能需要手动移动到新位置,或者 Storage
类的 post_process
方法可能会处理这个问题。
像所有的部署任务一样,细节决定成败。每个生成环境的配置可能都有点不同个,所以,需要调整基础配置以满足你的需求。以下是常见模式,可能对你有所帮助。
在同一服务器提供站点和静态文件服务¶
如果你想在早已提供站点服务器服务器上同时提供静态文件服务,操作步骤类似这样:
- 将代码推送至部署服务器。
- 在服务器上运行
collectstatic
,将所有的静态文件拷贝至STATIC_ROOT
。 - 配置 Web 服务器,使其在
STATIC_URL
下为STATIC_ROOT
目录下的文件提供静态文件服务。例如, 这里是如何以 Apache 配合 mod_wsgi 开始。
你可能期望将该流程自动化,特别是在你有好几个 web 服务器的时候。
专用服务器提供静态文件服务¶
大多数大型 Django 网站使用一个单独的 Web 服务器——即一个不同时运行 Django 的服务器——来提供静态文件。这台服务器通常运行不同类型的网络服务器——速度更快,但功能不全。一些常见的选择是:
如何配置这些服务器超出了本文范围;查阅这些服务器各自的文档获取介绍。
由于静态文件服务器并不运行 Django,你需要将部署策略改成这样:
- 当静态文件改变时,本地运行
collectstatic
。 - 将本地
STATIC_ROOT
推送到静态文件服务器提供服务的目录。 rsync 是一个常见选项,因为这种配置只会传输文件修改部分的数据流。
从云服务或 CDN 提供静态文件服务¶
另一个常见的策略是从云存储供应商,如亚马逊的 S3 和/或 CDN(内容交付网络)中提供静态文件。这可以让你忽略提供静态文件的问题,而且通常可以使网页的加载速度更快(特别是在使用 CDN 时)。
使用这些服务时,基本的工作流程与上面类似,除了要将静态文件传输给存储服务商或 CDN,而不是用 rsync
将静态文件传输给服务器。
有许多方法可以做到这一点,但如果提供商有一个 API,你可以使用一个 自定义文件存储后端 来将 CDN 集成到你的 Django 项目中。如果你编写了或正在使用第三方的自定义存储后端,可以通过在 STORAGES
中设置 staticfiles
来告诉 collectstatic
使用它。
例如,若你已在 myproject.storage.S3Storage
中写了一个 S3 存储后端,可以这么用:
STORAGES = {
# ...
"staticfiles": {"BACKEND": "myproject.storage.S3Storage"}
}
一旦完成了这些步骤,你只需运行 collectstatic
,你的静态文件将通过存储包上传到 S3。如果以后需要切换到不同的存储提供商,你可能只需更改 STORAGES
设置中的 staticfiles
。
关于如何编写这些后端的细节,参考 如何编写一个自定义的文件存储类。有很多可用的第三方应用提供了针对常见文件存储 API 的存储后端。 djangopackages.org 入门 是个不错的起点。
了解更多¶
想要了解所有配置项,命令,模板标签和 django.contrib.staticfiles
包含的其它零碎的完整细节,参考 staticfiles 参考。