0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

djangoでstaticソース(jsやcss)が読めなくなった対応

Last updated at Posted at 2023-08-16

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は同じサーバ(コンテナ)内であることが多く、解消されなかった

対応

よくある対応

settings.py
DEBUG = False # これがFalseなのが大前提。Trueだとstaticもdjangoが提供する
STATIC_URL = 'static/'
STATIC_ROOT = '/var/www/static/'
httpd.conf
<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で共有する

docker-compose.yml
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以外!!

httpd.conf
<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が読めるようになった。

全体の構成やソースは時間があるときに記事にしようかな

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?