Skip to main content

部署静态文件

在生产中提供静态文件

将静态文件投入生产的基本概要很简单:当静态文件更改时运行 collectstatic 命令,然后安排将收集的静态文件目录(STATIC_ROOT)移动到静态文件服务器并提供服务。根据 STATICFILES_STORAGE,文件可能需要手动移动到新位置,或 Storage 类的 post_process 方法可能会照顾到。

当然,就像所有的部署任务,魔鬼的细节。每个生产设置都会有所不同,因此您需要调整基本大纲以适应您的需求。下面是一些可能有帮助的常见模式。

从同一服务器提供网站和您的静态文件

如果您要从已经在为您的网站提供服务的同一台服务器提供静态文件,该过程可能如下所示:

你可能想要自动化这个过程,特别是如果你有多个Web服务器。有很多方法可以做这种自动化,但许多Django开发人员喜欢的一个选项是

在下面的部分中,我们将展示一些自动化这些文件部署选项的示例fabfiles(即Fabric脚本)。 fabfile的语法相当简单,但不会在这里讨论;请咨询 Fabric的文档,以获取对语法的完整解释。

因此,将静态文件部署到几个Web服务器的fabfile可能看起来像:

from fabric.api import *

# Hosts to deploy onto
env.hosts = ['www1.example.com', 'www2.example.com']

# Where your project code lives on the server
env.project_root = '/home/www/myproject'

def deploy_static():
    with cd(env.project_root):
        run('./manage.py collectstatic -v0 --noinput')

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

大多数较大的Django站点使用单独的Web服务器(即不运行Django的服务器)来提供静态文件。此服务器通常运行不同类型的Web服务器 - 更快,但不太全功能。一些常见的选择是:

配置这些服务器超出本文档的范围;请检查每个服务器的相应文档以获取说明。

由于您的静态文件服务器不会运行Django,您需要修改部署策略,看起来像:

  • 当静态文件更改时,在本地运行 collectstatic

  • 将您的本地 STATIC_ROOT 上传到静态文件服务器,进入正在提供的目录。 rsync 是此步骤的常见选择,因为它只需要传输已更改的静态文件的位。

这里是如何在fab文件中看起来:

from fabric.api import *
from fabric.contrib import project

# Where the static files get collected locally. Your STATIC_ROOT setting.
env.local_static_root = '/path/to/static'

# Where the static files should go remotely
env.remote_static_root = '/home/www/static.example.com'

@roles('static')
def deploy_static():
    local('./manage.py collectstatic')
    project.rsync_project(
        remote_dir=env.remote_static_root,
        local_dir=env.local_static_root,
        delete=True,
    )

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

另一个常见的策略是从云存储提供商(如Amazon的S3和/或CDN(内容交付网络))提供静态文件。这使您可以忽略提供静态文件的问题,并且通常可以加快加载网页(特别是在使用CDN时)。

当使用这些服务时,基本工作流看起来有点像上面,除了不是使用 rsync 将静态文件传输到服务器,您需要将静态文件传输到存储提供程序或CDN。

有很多方法可以做到这一点,但如果提供商有一个API,自定义文件存储后端 将使该过程非常简单。如果您已编写或正在使用第三方自定义存储后端,则可以通过将 STATICFILES_STORAGE 设置到存储引擎来告诉 collectstatic 使用它。

例如,如果您在 myproject.storage.S3Storage 中编写了S3存储后端,则可以使用它:

STATICFILES_STORAGE = 'myproject.storage.S3Storage'

一旦完成,你所要做的就是运行 collectstatic,你的静态文件将被推送通过你的存储包到S3。如果以后需要切换到其他存储提供程序,则可能与更改 STATICFILES_STORAGE 设置一样简单。

有关如何编写其中一个后端的详细信息,请参阅 编写自定义存储系统。有第三方应用程序可用于为许多常见的文件存储API提供存储后端。一个好的起点是 概述在djangopackages.com

学到更多

有关 django.contrib.staticfiles 中包含的所有设置,命令,模板标签和其他部分的完整详细信息,请参阅 静态文件引用