Django入門|Nginxでstaticファイルを読み込む設定のイメージ画像

Django入門|Nginxでstaticファイルを読み込む設定

  • 公開日:2020/03/12
  • 更新日:2020/03/12
  • 投稿者:n bit

Djangoのアプリケーションを本番環境にデプロイした際Nginxでstaticファイルを読み込む設定方法を解説します。ローカル環境から本番環境へ移行するときにこの設定を行っておかないと各種静的ファイルがロードされません。

  • Python
  • Django
  • サーバ

この記事は約 分で読めます。(文字)

Djangoの開発環境と本番環境での
静的ファイル読み込み方法の違い

ウェブサイトやウェブアプリケーションでは実行されるアプリケーションプログラムとは別に画像やCSS、JavaScriptなどのファイルも配信されています。「静的ファイル (static files)」と呼ばれているものです。

Djangoではこれらstaticファイルの読み込み方が開発環境と本番環境で違っています。

開発環境と本番環境で静的ファイルの読み込み方法を変える理由は実行効率

staticファイルは実行されるアプリケーションプログラムとは別に配置場所を設けることが通常です。理由は実行プログラムとstaticファイルへのリクエストを分けることでアプリケーションへの負荷を減らし、かつstaticファイルの読み込み効率を向上させるから。

同じサーバ内でディレクトリを分ける。サーバをアプリケーション用と静的ファイル用のサーバで分けることも可能で、staticファイルにディストリビューションサーバ(CDN)等を追加で導入してさらに効率を上げるなど戦略の幅も広がるでしょう。

ローカル開発時の環境ではDjango側で一括管理

staticファイルの配置場所をアプリケーションプログラムと別にする方法はstaticファイルへのアクセスをサーバ側に委ねるためローカルでの開発時には環境構築や管理の面も含めて向いていません。そのため開発時にはアプリケーション内に直接staticディレクトリを作成し静的ファイルを配置。Django側のアプリケーションを使って読み込んでいます。

同じルートディレクトリ内に全てのファイルが格納されているのであればファイル管理やバージョン管理は容易ですね。サーバもDjangoで開発時に起動されるモノだけで済むので環境構築もラクできる。

ただし、当然デメリットもありDjango側に全て負担させるためプログラムの実行効率は悪くセキュリティ面も下がりやすくなります。

そこで、本番環境では静的ファイルを実行プログラムとは別の場所に配置し、サーバ側にリクエストを処理させることが必要になるわけですね。このようにDjangoでは開発時には利便性を、本番環境では実行効率を優先できるように考えられています。

開発環境から本番環境へ移行するときの流れ

一つ一つの設定方法を細かく解説する前に開発環境から本番環境移行するときの一通りの流れを簡易的に押さえておきましょう。その方が全体像把握して理解しやすくなります。

  • 1:静的ファイルの設定を変更
  • 2:静的ファイルを単一のディレクトリに集約
  • 3:Nginxで/static/下のファイルに対するリクエストを集約ディレクトリに向けるように設定

このようにステップは非常にシンプルで内容さえ最初にしっかり理解しておけば怖くありません。

静的ファイルの設定を変更

本番環境に設定ファイルの設定を変更します。staticファイルの設定はsettings.pyの中に記述されていますのでここ変更していきましょう。

必須の設定項目は下記の2項目。

  • STATIC_ROOT:本番環境用のStaticファイルを置くルートディレクトリを設定
  • STATIC_URL:テンプレート側でstaticを呼び出す時のURLを設定

サーバ側でstaticファイルの配信を簡単にするため1つのルートディレクトリ内にすべてのファイルを集約して配置します。その配置先のルートディレクトリをSTATIC_ROOTに設定しましょう。

STATIC_URLについてはデフォルトで

STATIC_URL = '/static/'

になっていますので変更の必要はありません。

下記1項目は必要に応じて記述。

  • STATICFILES_DIRS:STATIC_ROOT内に集約したいstaticファイルを置くディレクトリを設定

STATICFILES_DIRSの詳細は次のセクションで補足説明します。

静的ファイルを単一のディレクトリに集約

先ほどサーバ側での配信を簡単にするためSTATIC_ROOTに設定されたルートディレクトリ内にすべてのファイルを集約するとお伝えしましたが全てを手動でやるとなると骨が折れます。Djangoではこれを自動化するためのコマンドが標準で実装されていますのでこちらを利用しましょう。

実行コマンドは以下の通り。下記のコマンドを実行するだけでSTATIC_ROOTへ自動的に集約されます。

python manage.py collectstatic

my_app/static/ 内に配置された静的ファイルはSTATIC_ROOTで設定したルートディレクトリ内へ自動的に集約されるのですが、独自で設定した場所の静的ファイルまでは集約してくれません。

そのようなstaticファイルがある場合はSTATICFILES_DIRSにそのディレクトリを設定することで自動的に集約される対象となります。

ちなみに、「python manage.py collectstatic」コマンドで現在自動読み込み可能なstaticファイルのディレクトリを全て確認するのに使えるのは下記のコマンド。

python manage.py findstatic .

STATIC_ROOTに自動集約されるstaticファイルの読み込み元がリストアップされます。

Nginxで/static/下のファイルに対するリクエストを
集約ディレクトリに向けるように設定

ここまで実行できれば後はサーバ側の設定ファイルに/static/下のファイルに対してリクエストが送られてきた場合、STATIC_ROOTに設定されたルートディレクトリに向くように設定しましょう。

今回はNginxで設定での設定。confファイルに以下のように設定します。

server {




location /static/ {
root STATIC_ROOTディレクトリのpath;
}



}

今日のdot

開発環境と本番環境で静的ファイルの扱いをうまく変更して、開発の効率性と本番環境での実行効率を両立させているメリットは大きいでしょう。開発環境から本番環境へ移行する際の自動化コマンドも充実しているためCDN等を本番環境で導入してもメンテナンス性が高く実行効率の良い環境を維持できます。