「example.com」というドメイン名ですでに運用しているところに追加で「sub.example.com」も使いたいという想定で書きます。
また、Django の処理には Gunicorn を使っています。
- ネームサーバーでサブドメインの設定をする
- サブドメイン用のディレクトリを作る
- 仮想環境と Django プロジェクトを作成する
- Gunicorn を設定する
- Nginx の設定ファイルにサブドメインの処理を追記する
1. ネームサーバーでサブドメインの設定をする
ネームサーバーでサブドメインを登録します。
さくらインターネットを使っている場合は会員メニュー > ドメイン > ゾーン表示の画面で登録できます。
フィールド | 値 |
エントリ名 | sub |
種別 | 別名 (CNAME) |
値 | @ |
DNSチェック | する |
TTLの設定 | なし |
2. サブドメイン用のディレクトリを作る
任意の場所にサイトをホストするためのディレクトリを作成します。
例えば「example.com」というディレクトリの配下にさらにサブドメイン用に「sub」ディレクトリ、その配下に「html」と作る場合は下記の様な形。
$ cd var/www/example.com $ mkdir sub $ cd sub $ mkdir html
ディレクトリの管理者を変更します。
$ sudo chown -R $USER:$USER /var/www/example.com/sub/html/
注意
一度上記の管理者の変更を飛ばした際、後で Django の「python manage.py startapp アプリ名」を実行した時に「ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?」というエラーが出ました。
「pip install django」を実行した際に django モジュールが仮想環境内に上手くインストールされなかったことが原因です。
3. 仮想環境と Django プロジェクトを作成する
Python の仮想環境を作成、起動します。
$ cd var/www/example.com/sub/html/ $ python3.9 -m venv dj_proj_venv $ cd dj_proj_venv $ source bin/activate
Django を pip install し、プロジェクトとアプリケーションを作成します。
(dj_proj_venv) $ pip install django (dj_proj_venv) $ django-admin startproject dj_proj (dj_proj_venv) $ cd dj_proj (dj_proj_venv) $ python manage.py startapp dj_app
settings.py の INSTALLED_APPS にアプリケーションを追記します。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'dj_app.apps.DjAppConfig', # 追記分 ]
settings.py の ALLOWED_HOSTS にサブドメインを含むドメインを記述します。
ALLOWED_HOSTS = ['sub.example.com']
4. Gunicorn を設定する
Gunicorn をインストールします。
$ pip install gunicorn
.socket ファイルの作成
サブドメイン用に「example_sub.socket」というファイルを作成します。
# example_sub.socket [Unit] Description=gunicorn socket [Socket] ListenStream=/run/example_sub.sock [Install] WantedBy=sockets.target
項目 | メモ |
Description | ログ出力の際などに使われる |
ListenStream | ポートの指定。Nginx 設定ファイルの pass_proxy で指定 |
WantedBy | sockets.target |
.service ファイルの作成
サブドメイン用に「example_sub.service」というファイルを作成します。上記の「example_sub.socket」と対応しています。
# example_sub.service [Unit] Description=gunicorn daemon Requires=example_sub.socket After=network.target [Service] User=root Group=root WorkingDirectory=/var/www/example.com/sub/html/dj_proj_venv/dj_proj ExecStart=/var/www/example.com/sub/html/dj_proj_venv/bin/gunicorn --workers 3 --bind unix:/run/sample_django.sock dj_proj.wsgi:application [Install] WantedBy=multi-user.target
項目 | メモ |
Description | ログ出力の際などに使われる |
Requires | 対応する .socket ファイル |
After | |
User | |
Group | |
WorkingDirectory | manage.py があるディレクトリのフルパス? |
ExecStart | systemctl start した時に実行するコマンド。 .sock と wsgi を bind。 venv 内の gunicorn のフルパス(?)を指定 |
WantedBy | 大抵 multi-user.target で大丈夫 |
socket の待ち受けを開始します。
$ systemctl start example_sub.socket $ systemctl start example_sub.service
5. Nginx の設定ファイルにサブドメインの処理を追記する
「sub.example.com」と「example.com」の処理が記述されています。
それぞれの proxy_pass の記述を見るとわかりますが、「sub.example.com」へのリクエストの場合は example_sub.sock のソケット、「example.com」へのリクエストの場合は example.sock のソケットへ処理が回されます。
server { listen 80; listen [::]:80; server_name sub.example.com; root /var/www/example.com/sub/html; index index.html; location / { proxy_set_header Host $http_host; proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://unix:/run/example_sub.sock; } location /static { alias /var/www/example.com/sub/html/static; } } server { listen 80; listen [::]:80; server_name example.com; root /var/www/example.com/html; index index.html; location / { proxy_set_header Host $http_host; proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://unix:/run/example.sock; } location /static { alias /var/www/example.com/html/static; } }