Djangoでstatic ソースが見れなくなった
ローカル(開発環境)ではDEBUG = True & runserver で実行していたが、本番相当の環境を作成しようと、DEBUG = Falseにして、apacheサーバ(コンテナ)を構築して実行したら、cssが404(because its MIME type ('text/html') ~)となり、読めなくなった
前提
・ Docker を使用して、アプリ(python Django)のコンテナとweb(apache)のコンテナは別
→ Djangoでstatic が見れなくなった対応はネットで結構あったが、djangoとapacheは同じサーバ(コンテナ)内であることが多く、解消されなかった
対応
よくある対応
DEBUG = False # これがFalseなのが大前提。Trueだとstaticもdjangoが提供する
STATIC_URL = 'static/'
STATIC_ROOT = '/var/www/static/'
<VirtualHost *:80>
Alias /static/ /var/www/static/
<Directory /var/www/static/>
Require all granted
</Directory>
</VirtualHost>
python3 manage.py collectstatic --noinput
これを実行することで、staticディレクトリにあるファイルが/var/www/static/に集められて、apacheは「/static/」のURLを「/var/www/static/」にして、static ファイルにアクセスできるというもの
問題点1
python3 manage.py collectstatic を実行しても djangoサーバ(コンテナ)の/var/www/static/にファイルが集まるだけなので、apacheサーバは見れない
docker Compose で/var/www/static/ を djangoとapacheで共有する
version: '3'
services:
python-django:
volumes:
- static-data:/var/www/static/
command: sh -c "python3 manage.py collectstatic --noinput & python3 manage.py process_tasks & uwsgi --http 0.0.0:8000 --module プロジェクト名.wsgi --master"
apatch:
volumes:
- static-data:/var/www/static/
volumes:
static-data:
問題点2
apacheにリクエストきた内容をdjangoに渡す必要があるため、Proxyの設定を追加
※ static以外!!
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass /static/ !
ProxyPass / http://djangoのコンテナ名:8000/
ProxyPassReverse / http://djangoのコンテナ名:8000/
Alias /static/ /var/www/static/
<Directory /var/www/static/>
Require all granted
</Directory>
</VirtualHost>
実はここまでは普通に調べて実装できていた。ログを調べるとstatic(css)もapacheサーバにはリクエストがきて、djangoに渡していることがわかった。
staticはdjangoに渡さず、Apache側で処理をすべきなのに・・・
なので「ProxyPass /static/ !」を追加
「static」はdjangoに渡す対象外とする。
これで staticが読めるようになった。
全体の構成やソースは時間があるときに記事にしようかな