静的ファイルのデプロイ¶
参考
django.contrib.staticfiles
の使い方の基本に関しては、静的ファイル (画像、JavaScript、CSS など) を管理する を読んでください。
本番環境における静的ファイルの配信¶
本番環境に静的 (static) ファイルを配置する基本的な流れは、次のように単純なものです。まず、静的ファイルが変更された時に、collectstatic
コマンドを実行します。そして、静的ファイル用のサーバへ移動する、収集 (collect) された静的ファイルのディレクトリ (STATIC_ROOT
) を用意し、ファイルを配信 (serve) できるようにします。setting:STATICFILES_STORAGE の設定によっては、ファイルを手動で新しい場所へ移動する必要があるかもしれません。ただし、Storage
クラスの post_process
メソッドが面倒を見てくれる場合もあります。
どんなデプロイのタスクでも、悪魔は細部に宿るものです。(訳注: Devil's in the detail。神は細部に宿る (God is in the detail) から派生したことわざ) それぞれの本番環境でセットアップには僅かに違いがあるものなので、基本的な流れに沿うように多少の手直しが必要になるかもしれません。以下によくあるパターンを紹介しているので、参考にしてください。
サイトと静的ファイルを同じサーバから配信する¶
静的ファイルをすでにサイトを配信しているのと同じサーバから配信したい場合、配信の手順は次のようになります。
- デプロイするサーバにコードを push する。
- サーバ側で、
collectstatic
を実行することで、すべての静的ファイルをSTATIC_ROOT
で設定したディレクトリに集める。 STATIC_ROOT
に置かれたファイルをSTATIC_URL
から配信するように、Web サーバの設定を行う。たとえば、Apache と mod_wsgi を使用している場合、Apache と mod_wsgi を使用したファイルの配信 が参考になると思います。
複数の Web サーバーがある場合は、おそらくこのプロセスを自動化したいと思うでしょう。
専用のサーバから静的ファイルを配信する¶
比較的大きな Django サイトでは、Django を実行しているのとは異なる専用のサーバを用意して、静的ファイルを配信するのがふつうです。こうした専用サーバでは、高速なサーバや機能を限定したサーバなど、普通の Web サーバとは異なる種類のサーバを利用します。よくある選択肢としては、次のものが挙げられます。
これらのサーバの設定方法は、このドキュメントの範囲外です。それぞれのサーバのドキュメントを参考に設定してください。
静的ファイルサーバでは Django が実行されていないので、次のようにデプロイの戦略を変更する必要があります。
- 静的ファイルが変更されたら、ローカル側で
collectstatic
を実行する。 - ローカル側の
STATIC_ROOT
を静的ファイルサーバのファイル配信ディレクトリにアップロードします。これには、rsync を使用するのが一般的です。rsync を利用すれば、変更された静的ファイルの情報だけを転送することができます。
クラウドサービスや CDN から静的ファイルを配信する¶
もう一つのよく用いられる方法は Amazon の S3 や CDN (コンテンツ・デリバリー・ネットワーク) のようなクラウドストレージから静的ファイルを利用する方法です。この方法では静的ファイルの取扱いに関する問題を無視できるようにし、(特に CDN を利用している場合は) しばしば Web ページの高速なローディングの助けとなります。
これらのサービスを使う場合でも、基本的なワークフローは上で説明した通りです。ただし、rsync
を使って静的ファイルをサーバに転送する代わりに、ストレージプロバイダや CDN に転送する必要があります。
そのための方法はいろいろありますが、プロバイダが API を提供している場合、custom file storage backend を使えば、プロセスを非常に簡単にすることができます。すでに自分でこれを書いているか、サードパーティの custom file storage backend を使っているなら、STATICFILES_STORAGE
をストレージエンジンに設定するだけで、collectstatic
でストレージプロバイダを使用することができます。
たとえば、S3 storage backend を myproject.storage.S3Storage
としてすでに書いていれば、次のように書くだけでこのストレージを利用できます。
STATICFILES_STORAGE = 'myproject.storage.S3Storage'
一度これを設定すれば、あとは collectstatic
を実行するだけで、ストレージパッケージ経由で静的ファイルを S3 へアップロードすることができます。後で別のストレージプロバイダに乗り換えることになったとしても、STATICFILES_STORAGE
の設定を書き換えるだけで、簡単にプロバイダを変更できます。
For details on how you'd write one of these backends, see カスタムストレージシステムの作成. There are 3rd party apps available that provide storage backends for many common file storage APIs. A good starting point is the overview at djangopackages.org.
さらに学ぶ¶
すべての設定、コマンド、テンプレートタグなどの詳細と、django.contrib.staticfiles
に含まれているその他の機能については、staticfiles リファレンス を読んでください。