Docker nginx-proxy Django https接続時のapp/settings.pyの設定

Dockerで、Django appjwilder/nginx-proxyjrcs/letsencrypt-nginx-proxy-companionの3コンテナを連携させる時の、Django appsettings.pyの設定メモ。(HTTPS対応関係)

jwilder/nginx-proxyがリバースプロキシとして動作する点に気をつける。これにより、

  • クライアント-nginx-proxy間: HTTPS
  • nginx-proxy-Django app間: HTTP

になる。また、自分の環境では1つのホスト内で、3コンテナを動作させている。

# app/settings.py
...
# Deployment settings(For security)

# まずはnginx-proxyで設定されないもの 

# ブラウザにコンテンツのタイプを推定させない。
SECURE_CONTENT_TYPE_NOSNIFF = True
# XSSをブロック
SECURE_BROWSER_XSS_FILTER = True
# 自サイト内でもフレーム使わないので、`SAME ORIGIN`でなく`DENY`にしておいた
X_FRAME_OPTIONS = 'DENY'
# HTTPS接続中のみ、CSRFクッキーを送るようにする
CSRF_COOKIE_SECURE = True
# HTTPS接続中のみ、セッションクッキーを送信する
SESSION_COOKIE_SECURE = True

# 以下は、nginx-proxyが設定するもの

# HTTP接続は、HTTPSにリダイレクトする。nginx-proxyが、
# リダイレクトしてくれるので、不要。Trueにすると無限ループするはず。
SECURE_SSL_REDIRECT = False
# nginx-proxyのdefault.confで設定される。
# SECURE_HSTS_SECONDS = 31536000
# nginx-proxyで各ドメインごとにHSTSの設定を行うので不要だと思う。
# SECURE_HSTS_INCLUDE_SUBDOMAINS = True
# Django appにhttpsでのアクセスか否か判断する方法を伝える
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

なお、ターミナル上で、docker-compose exec nginx-proxy shして、コンテナにアタッチした後、cat /etc/nginx/conf.d/default.confなどで、設定ファイルを見れば確認できる。

タイトルとURLをコピーしました