【Django】サブドメインを扱う方法【django-hosts】

アイキャッチ画像
  • Djangoでサブドメインを扱うには?
  • django-hostsの使い方とは?
  • Nginxにおけるサブドメインの設定方法とは?

本記事ではこのような疑問を解決します。


サブドメインは用途によってサイトを分割したい時に便利なものです。

よって、Djangoアプリにおいてもサブドメインの設定が必要になってくる場面は出てくるでしょう。


そこで今回はDjangoでサブドメインを扱う方法を解説していきます。

前提

はじめに本記事の前提を以下にまとめます。

・想定シチュエーションはDjangoアプリのデプロイ時

・ドメインやサブドメインはすでに取得済み

→DNSレコードで同一IPアドレスへ流す

・WebサーバーはNginxを使用

なお、デプロイ方法についてはこちらの記事を前提とします。

関連記事

Djangoアプリをデプロイする手順とは?NginxとGunicornの使い方とは? 本記事ではこのような疑問を解決します。Djangoアプリをデプロイする際に、簡単にできるのはHerokuなどのPaaS(Platform as a[…]

アイキャッチ画像

django-hostsをインストールする

まずは、Djangoでサブドメインを扱うためのライブラリであるdjango-hostsをインストールします。

下記のコマンドを実行しましょう。

$ pip install django-hosts

※django-hosts公式ドキュメントはこちら

ちなみに、似たようなライブラリでdjango-subdomainsというものがありますが、
これはバージョンが古いためうまく機能しません。

したがって、現状django-hostsの一択です。

settings.pyを編集する

ここではsettings.py内にいくつか記述を追加していきます。

INSTALLED_APPS

INSTALLED_APPS内にライブラリを追加します。

INSTALLED_APPS = [
        ...
    'django_hosts',# 追加
]

MIDDLEWARE

MIDDLEWARE内の先頭と末尾に以下の記述を追加します。

MIDDLEWARE = [
    'django_hosts.middleware.HostsRequestMiddleware',# 先頭に追加
        ...
    'django_hosts.middleware.HostsResponseMiddleware',# 末尾に追加
]

ROOT_HOSTCONF

ROOT_HOSTCONFにプロジェクトのurls.pyを指定します。

ROOT_HOSTCONF = 'プロジェクト名.hosts'
※こちらのファイルは後ほど作成

DEFAULT_HOST

DEFAULT_HOSTにデフォルトにしたいサブドメインを指定します。

DEFAULT_HOST = ''
※サブドメインがsubchan.example.comの場合、DEFAULT_HOST = 'subchan'

ホスティング用ファイル(hosts.py)を作成する

下記のコマンドでファイルを作成します。

$ touch プロジェクト名/hosts.py
※settings.pyと同じディレクトリ

hosts.pyを作成したら、以下のように記述します。

基本的にはサブドメインによってアクセスさせたいアプリのurls.pyを設定します。

from django.conf import settings
from django_hosts import patterns, host

host_patterns = patterns('',
    host('', settings.ROOT_URLCONF, name=''),
    host('subchan', 'アプリ名.urls', name='アプリ名'),# サブドメインがsubchan.example.comの場合
)

これでDjango側の設定は完了です。

ちなみに、プロジェクトのurls.pyからアプリのurls.pyを読み込んでいる場合は、
「path(”, include(‘アプリ名.urls’)) 」の記述を削除しておきましょう。


なぜなら、アクセスをサブドメインからのみに限定したいからです。

Webサーバー(Nginx)側の設定をする

最後はWebサーバー側の設定です。

今回はWebサーバーにNginxを使用するので、Nginx設定ファイルを編集していきます。

※あくまで例なので、必要に応じて記述を変更してください。

SSL化前

server {
  listen 80;
  server_name example.com;※ドメイン

  location /static {
    alias /usr/share/nginx/html/static;
  }

  location /media {
    alias /usr/share/nginx/html/media;
  }

  location / {
    proxy_pass http://unix:/home/ubuntu/Djangoプロジェクト名/Djangoプロジェクト名.sock;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

server {
  listen 80;
  server_name subchan.example.com;※サブドメイン

  location /static {
    alias /usr/share/nginx/html/static;
  }

  location /media {
    alias /usr/share/nginx/html/media;
  }

  location / {
    proxy_pass http://unix:/home/ubuntu/Djangoプロジェクト名/Djangoプロジェクト名.sock;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

SSL化後

server {
  listen 443 ssl;
  server_name example.com;※ドメイン

  ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;

  location /static {
    alias /usr/share/nginx/html/static;
  }

  location /media {
    alias /usr/share/nginx/html/media;
  }

  location / {
    proxy_pass http://unix:/home/ubuntu/Djangoプロジェクト名/Djangoプロジェクト名.sock;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

server {
  listen 443 ssl;
  server_name subchan.example.com;※サブドメイン

  ssl_certificate /etc/letsencrypt/live/サブドメイン名/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/サブドメイン名/privkey.pem;

  location /static {
    alias /usr/share/nginx/html/static;
  }

  location /media {
    alias /usr/share/nginx/html/media;
  }

  location / {
    proxy_pass http://unix:/home/ubuntu/Djangoプロジェクト名/Djangoプロジェクト名.sock;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

まとめ

以上がDjangoでサブドメインを扱う方法になります。

今回の例ではDjango側とWebサーバー側の設定が必要になりました。

内容としてはdjango-hostsでルーティング設定をして、
Nginxでサブドメインを受け付ける設定をするだけですね。

これでDjangoでのサブドメインの扱いはバッチリです!