BloomScheme Blog

株式会社ブルームスキーム公式ブログ

nginx + Djangoアプリでアップロードした画像がサイトに表示されないときのトラブルシューティング

タイトルの内容通りの不具合があり、其の対応をしたときにわかった対処方法を共有します。

何が起きたか

ウェブアプリ上で画像を投稿したときに稀に表示できない画像があることがありました。 原因を調査した所、その画像をリクエストしたときのhttpレスポンスが403になっておりました。 developer.mozilla.org

どうやらnginxからファイルへのアクセスする権限がなかったようです。 問題の画像ファイルのパーミッションを確認した所、なぜか 600になっておりました。 Djangoアプリとnginxは別のユーザに起動されているので、Djangoアプリが作成したファイルをnginxが読み込めない事によって、問題が起きていることが発覚しました。

対処方法

参考記事 stackoverflow.com

Djangoにはファイルアップロード時にパーミッションを設定するコンフィグがあります。 settings.pyに以下の項目を追加することでnginx等からファイルを読み込み可能にできます。 python2系なら
FILE_UPLOAD_PERMISSIONS = 0644 python3系なら
FILE_UPLOAD_PERMISSIONS = 0o644

以上を設定してDjangoアプリを再起動した所、問題が解消しました。 この時点では、すでにアップロードされているファイルの表示ができない問題が解決していなかったので、以下のコマンドを実行しました。 $ chmod -R +r ./
これはカレントディレクトリ以下のすべてのファイルに再帰的に読み込み権限を付与する物です。
実行する場所に注意されたし。