Djangoでつまづいた話。
今試験的に作っているwebページはサーバーサイドをDjangoで作っているわけですが、今日は一般に公開しているサーバにデプロイした時に躓いたことをメモっておきますφ(..)
設定の話は細かすぎるから概論的なことを。
開発環境ではPycharmでデバッグをしているのですが、その時には何ら問題なかったソースがサーバに上げると途端に動かなくなりました。
Djangoはちゃんとリクエストを受け付けていて、viewの表示もしているけど、JSやCSS、その他の静的なコンテンツが全く表示されていませんでした。
ちなみに環境は
- ホストOS。
フロントのwebサーバー。リクエストを受け付けたらDjangoが動作するサーバーにリクエストを転送
- Djangoが動作するDockerイメージ
- PostgreSQLが動作するDockerイメージ(今回は無関係)
という感じでやってます。
結論からいうと、原因は私の設定漏れでした。
というのも、Djangoのそもそもの仕様を理解していなかったためです。
Djangoはセキュリティの観点から、静的なファイルはwebサーバに公開しているディレクトリに配置することを推奨してるみたいです。
プログラムファイルはまた別の仕組みで動いているみたい。
特段webに公開していません。
ですので本番で動かすときは行うこととして注意するのが
- (必要があれば)モデルのマイグレーション
manage.py migrate
- (必要があれば)静的なファイルのデプロイ
manage.py collectstatic
というコマンドを打つ必要があります。
ちなみにデプロイ時に静的なファイルを出力するフォルダの設定は
settings.pyで設定します。
STATIC_ROOT = "/var/www/html/static"
設定するフォルダはwebサーバから見れる場所じゃないといけません。
私の環境だとここで問題が。
もともとDjangoはDocker上で動いていて、Docker上のフォルダはwebサーバーからは一切見れない状況なのです。
Nginxの設定も任意のサブドメインにきたリクエストは全てDockerのDjangoにまるなげするような設定でした。
なので少し設定を変えました。
元のルール。
location / { proxy_pass http://127.0.0.1:{dockerで開放しているポート}; }
今回追加したルール
location ^~/static/ { root /var/www/html/static; }
とし、上記で設定したフォルダはホストサーバとDockerとでの共有フォルダにしました。
まぁなんか変な感じだけど、動いたからいっか。
Djangoの設定に関しては、同じような悩みの方もおりました。
こちらでより詳しく解説されてます。stackoverflow.com