---
title: "如何部署静态文件"
version: 5.1
locale: zh-hans
source: https://docs.djangoproject.com/zh-hans/5.1/howto/static-files/deployment/
canonical: https://djangodocs.dev/zh-hans/5.1/howto/static-files/deployment/
---
# 如何部署静态文件

> **See also**
>
> 想要 [`django.contrib.staticfiles`](/zh-hans/5.1/ref/contrib/staticfiles/#module-django.contrib.staticfiles) 的使用指南，请参考 [如何管理静态文件（如图片、JavaScript、CSS）](/zh-hans/5.1/howto/static-files/)。

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

将静态文件放入生产环境的基本步骤包括两个步骤：静态文件更改时运行 [`collectstatic`](/zh-hans/5.1/ref/contrib/staticfiles/#django-admin-collectstatic) 命令，然后安排已收集的静态文件目录 ([`STATIC_ROOT`](/zh-hans/5.1/ref/settings/#std-setting-STATIC_ROOT)) 移动到静态文件服务器并提供服务。根据 `staticfiles` [`STORAGES`](/zh-hans/5.1/ref/settings/#std-setting-STORAGES) 别名，可能需要手动移动文件或 `Storage` 类的 [`post_process`](/zh-hans/5.1/ref/contrib/staticfiles/#django.contrib.staticfiles.storage.StaticFilesStorage.post_process) 方法可能会处理该问题。

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

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

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

- 将代码推送至部署服务器。
- 在服务器上运行 [`collectstatic`](/zh-hans/5.1/ref/contrib/staticfiles/#django-admin-collectstatic)，将所有的静态文件拷贝至 [`STATIC_ROOT`](/zh-hans/5.1/ref/settings/#std-setting-STATIC_ROOT)。
- 配置 Web 服务器，使其在 [`STATIC_URL`](/zh-hans/5.1/ref/settings/#std-setting-STATIC_URL) 下为 [`STATIC_ROOT`](/zh-hans/5.1/ref/settings/#std-setting-STATIC_ROOT) 目录下的文件提供静态文件服务。例如， [这里是如何以 Apache 配合 mod\_wsgi 开始](/zh-hans/5.1/howto/deployment/wsgi/modwsgi/#serving-files)。

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

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

大多数大型 Django 网站使用一个单独的 Web 服务器——即一个不同时运行 Django 的服务器——来提供静态文件。这台服务器通常运行不同类型的网络服务器——速度更快，但功能不全。一些常见的选择是：

- [Nginx](https://nginx.org/en/)
- 一个 [Apache](https://httpd.apache.org/) 的朴素版本

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

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

- 当静态文件改变时，本地运行 [`collectstatic`](/zh-hans/5.1/ref/contrib/staticfiles/#django-admin-collectstatic)。
- 将本地 [`STATIC_ROOT`](/zh-hans/5.1/ref/settings/#std-setting-STATIC_ROOT) 推送到静态文件服务器提供服务的目录。 [rsync](https://rsync.samba.org/) 是一个常见选项，因为这种配置只会传输文件修改部分的数据流。

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

另一个常见的策略是从云存储供应商，如亚马逊的 S3 和/或 CDN（内容交付网络）中提供静态文件。这可以让你忽略提供静态文件的问题，而且通常可以使网页的加载速度更快（特别是在使用 CDN 时）。

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

有许多方法可以做到这一点，但如果提供商有一个 API，你可以使用一个 [自定义文件存储后端](/zh-hans/5.1/howto/custom-file-storage/) 来将 CDN 集成到你的 Django 项目中。如果你编写了或正在使用第三方的自定义存储后端，可以通过在 [`STORAGES`](/zh-hans/5.1/ref/settings/#std-setting-STORAGES) 中设置 `staticfiles` 来告诉 [`collectstatic`](/zh-hans/5.1/ref/contrib/staticfiles/#django-admin-collectstatic) 使用它。

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

```
STORAGES = {
    # ...
    "staticfiles": {"BACKEND": "myproject.storage.S3Storage"}
}
```

一旦完成了这些步骤，你只需运行 [`collectstatic`](/zh-hans/5.1/ref/contrib/staticfiles/#django-admin-collectstatic)，你的静态文件将通过存储包上传到 S3。如果以后需要切换到不同的存储提供商，你可能只需更改 [`STORAGES`](/zh-hans/5.1/ref/settings/#std-setting-STORAGES) 设置中的 `staticfiles`。

关于如何编写这些后端的细节，参考 [如何编写一个自定义的文件存储类](/zh-hans/5.1/howto/custom-file-storage/)。有很多可用的第三方应用提供了针对常见文件存储 API 的存储后端。 [djangopackages.org 入门](https://djangopackages.org/grids/g/storage-backends/) 是个不错的起点。

## 了解更多

想要了解所有配置项，命令，模板标签和 [`django.contrib.staticfiles`](/zh-hans/5.1/ref/contrib/staticfiles/#module-django.contrib.staticfiles) 包含的其它零碎的完整细节，参考 [staticfiles 参考](/zh-hans/5.1/ref/contrib/staticfiles/)。
