本番環境のAdmin画面の崩れ
NginxでDjangoアプリをクラウドにデプロイしたら、なぜかローカルで綺麗に表示された管理画面(AdminSite)のレイアウトが下記の図のように崩れてしまいました。
いつもローカルでpython manage.py runserverで開発サーバーを立ち上げるとき、何もせずとも管理画面が綺麗に表示してくれたので、困ったもんですね。。
そこで、Chatgptと先人たちの知恵をかりながらこの問題を無事に解消したので、その解消法をご紹介いたします。
Djangoの静的ファイル設定
Djangoプロジェクトでは、静的ファイルの設定は主にSTATIC_URL
とSTATIC_ROOT
に関係します。
設定例
DjangoProjectのsettings.py
で:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
-
STATIC_URL
:テンプレートで静的ファイルを参照するためのURLプレフィックス。 -
STATIC_ROOT
:collectstatic`コマンドで全ての静的ファイルを集めるディレクトリ。
静的ファイルの収集
本番環境では、以下のコマンドを実行して静的ファイルを収集します:
python manage.py collectstatic
これにより、全ての静的ファイルがSTATIC_ROOT
に指定されたディレクトリに集められます。
Nginxの設定
Nginxでは、静的ファイルのパスを正しく設定する必要があり、今回の問題はまさにNginxの設定によるものでした。
Nginx設定例
server {
listen 80;
server_name your_server_ip;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
alias /path/to/your/project/staticfiles/;
# 問題があった設定↓
# root /path/to/your/project/staticfiles/;
}
location / {
include proxy_params;
proxy_pass http://unix:/path/to/your/project/your_project.sock;
}
}
- **`alias`**:リクエストパスを指定されたディレクトリに直接マッピングし、
- 静的ファイルディレクトリへの正しいマッピングを保証します。
Nginxの再起動
設定を完了したら、Nginxサービスを再起動して変更を適用していきます。
sudo systemctl restart nginx
再度管理画面にアクセスすると、、正常に表示されるようになりました!!
Nginxでのroot
とalias
の違い
Nginxで静的ファイルを提供する際、root
とalias
の使い方には重要な違いがあります。
root
-
説明:
root
はリクエストパスのプレフィックスを保持します。 -
使用例:
location /static/ {
root /path/to/your/project/staticfiles/;
}
- リクエストパスが
/static/css/style.css
の場合、rootは/static/をプレフィックスとして保持する:/path/to/your/project/staticfiles/static/css/style.css
alias
-
説明:
alias
はリクエストされたURIを指定されたディレクトリに直接マッピングします。 - 使用例:
location /static/ {
alias /path/to/your/project/staticfiles/;
}
- リクエストパスが
/static/css/style.css
の場合、 -
alias
は/static/をプレフィックスとして保持せず、指定のパスに直接にマッピングする:path/to/your/project/staticfiles/css/style.css
違いの説明:
-
パスの処理:
root
はURIのプレフィックス(パスや文字列の先頭部分)を保持し、alias
はそれを置き換えます。 -
適用シナリオ:静的ファイルのディレクトリを直接指定する場合は
alias
が適しています。
まとめ
ローカル環境ではDjangoが自動的に静的ファイルび解析をしてくれるので特段気にしていなかったのですが、本番環境ではDjangoとNginxの静的ファイルパスをきちんと設定を行ないとAdmin画面だけでなくアプリのコンテンツ画面も正常に表示されない可能性がありますので、今後は新しい確認視点として意識していこうと思います!
本記事がDjangoプロジェクトでの静的ファイル設定にお役立つことを願っています。
ご質問があれば、ぜひコメントしてください!