部署静态文件

在生产中提供静态文件

将静态文件部署到线上环境的基本步骤很简单:当静态文件改变时,运行collectstatic 命令收集静态文件,然后将该目录(STATIC_ROOT) 搬到静态文件服务器上。 根据STATICFILES_STORAGE的设置,这些文件可能需要手工移动到一个新的位置,或者使用Storage 类的post_process 方法完成该任务。

当然,与所有的部署任务一样,魔鬼隐藏在细节中。 每个线上环境的建立都会有所不同,所以你需要调整基本的纲要以适应你的需求。 下面是一些常见的方法,可能有所帮助。

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

如果你的静态文件和网站位于同一台服务器,流程可能像是这样:

你可能想自动化这个过程,特别是如果你有多台Web 服务器。 有许多种方法来完成这个自动化,但是许多Django 开发人员喜欢 Fabric

在下面和下面的部分中,我们将展示几个示例fabfiles(即 Fabric脚本)自动执行这些文件部署选项。 一个fabfile的语法是相当简单的,但这里不会被覆盖;有关语法的完整说明,请参阅Fabric的文档

所以,一个将静态文件部署到多台Web 服务器上的Fabric 脚本大概会是:

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 的服务器。 这种服务器通常运行一种不同类型的服务器 —— 更快但是功能很少。 一些常见的选择有:

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

既然你的静态文件服务器不会允许Django,你将需要修改的部署策略,大概会是这样:

  • 当静态文件改变时,在本地运行collectstatic
  • 将你本地的STATIC_ROOT 推送到静态文件服务器相应的目录中。 在这一步,常见的选择rsync ,因为它只传输静态文件改变的部分。

下面是Fabric 脚本大概的样子:

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 提供静态文件

另一个常见的策略是放置静态文档到一个云存储提供商比如亚马逊的S3 和/或一个CDN(Content Delivery Network)上。 这可以让您忽略提供静态文件的问题,并且通常可以使Web页面加载速度更快(特别是在使用CDN时)​​。

当使用这些服务时,除了不是使用rsync 传输你的静态文件到服务器上而是到存储提供商或CDN 上之外,基本的工作流程和上面的差不多。

有许多方式可以实现它,但是如果提供商具有API,那么custom file storage backend 将使得这个过程相当简单。 如果你已经写好或者正在使用第三方的自定义存储后端,你可以通过设置STATICFILES_STORAGE 来告诉collectstatic 来使用它。

例如,如果你已经在myproject.storage.S3Storage 中写好一个S3 存储的后端,你可以这样使用它:

STATICFILES_STORAGE = 'myproject.storage.S3Storage'

一旦完成这个,你所要做的就是运行collectstatic,然后你的静态文件将被你的存储后端推送到S3 上。 如果以后你需要切换到一个不同的存储提供商,你只需简单地修改你的STATICFILES_STORAGE 设置。

关于如何编写这些后端的细节,请参见Writing a custom storage system 有第三方的应用提供存储后端,它们支持许多常见的文件存储API。 一个好的起点是djangopackages.org上的概述。

了解更多

关于django.contrib.staticfiles 中包含的设置、命令、模板标签和其它细节,参见the staticfiles reference