Развертывание статических файлов

Раздача статических файлов на боевом сервере

The basic outline of putting static files into production consists of two steps: run the collectstatic command when static files change, then arrange for the collected static files directory (STATIC_ROOT) to be moved to the static file server and served. Depending on STATICFILES_STORAGE, files may need to be moved to a new location manually or the post_process method of the Storage class might take care of that.

Конечно же, как и в каждой процедуре развертывания, дьявол кроется в мелочах. Настройки сервера могут немного отличаться и вам придется затачивать все это под себя. Ниже мы описали несколько стандартных шаблонов, которые могут помочь вам.

Один сервер для приложения и для статики

Если вы используете один сервер для приложения и для статики, тогда процесс обновления следующий:

You’ll probably want to automate this process, especially if you’ve got multiple web servers.

Раздача статических файлов с отдельного сервера

Большие проекты на Django используют отдельный сервер для раздачи статических файлов. Обычно он отличается от сервера для проекта – более быстрый, но с меньшими возможностями. Вот несколько вариантов:

Настройка этих серверов не является темой этой статьи, читайте соответствующую документацию.

Т.к. статический сервер не запускает ваше приложение, необходимо поменять процесс обновления:

  • Когда статические файлы изменяются, выполните локально collectstatic.
  • Отправьте локальную версию STATIC_ROOT на статический сервер в каталог, который раздается сервером. rsync хороший инструмент для этого т.к. отправит на сервер только файлы, которые изменились.

Раздача статических файлов через облачный сервис или CDN

Еще один вариант раздачи статических файлов, это через облачные сервисы, такие как Amazon’s S3 и/или CDN (content delivery network). Это избавляет вас от проблем с раздачей статических файлов и часто уменьшает время загрузки страниц (особенно при использовании CDN).

При использовании сервисов, процесс обновления аналогичен описанному выше, но вместо отправки файлов на сервер статики через rsync мы отправляем их в хранилище сервиса или CDN.

There’s any number of ways you might do this, but if the provider has an API, you can use a custom file storage backend to integrate the CDN with your Django project. If you’ve written or are using a 3rd party custom storage backend, you can tell collectstatic to use it by setting STATICFILES_STORAGE to the storage engine.

Например, вы создали бэкенд для работы с S3 myproject.storage.S3Storage, можете использовать следующий код:

STATICFILES_STORAGE = 'myproject.storage.S3Storage'

Once that’s done, all you have to do is run collectstatic and your static files would be pushed through your storage package up to S3. If you later needed to switch to a different storage provider, you may only have to change your STATICFILES_STORAGE setting.

Как создать свой бэкенд для работы с файлами, смотрите в Writing a custom storage system. Есть много сторонних бэкендов для работы с API различных сервисов для хранения файлов. Начать поиск можно с djangopackages.com.

Узнайте больше

Подробности о настройках, командах, шаблонных тегах и других деталях, включая :mod:`django.contrib.staticfiles, смотрите раздел о статических файлах.