複数のDjangoプロジェクトの切り分け

サーバー情報

【さくらのVPS】
メモリ:8GB
ストレージ:SSD 400GB
CPU:6コア

OS

CentOS7 x86_64

インストール

Python:
pip:
git:
psql:
PostgreSQL:
Nginx:

3.6.8
9.0.3
1.8.3.1
9.2.24
9.2.24
1.16.1

仮想環境

Django:
Gunicorn:

3.1.4
20.0.4

Linuxサーバーで「Nginx+Gunicorn+Django」のWebアプリケーションを作成した際に、1つのプロジェクトだけを本番稼働させるのはちょっと勿体ないような気がしませんか!?

 

例えば、このようなシチュエーションが弊社では発生したので、複数のWebアプリケーションを稼働させることにしました。

  • お客様に提供するWebアプリケーション
  • 社内で運用するためのWebアプリケーション

 

もちろんURLは重複しないようにしっかりと管理しないといけませんが、2つ以上のプロジェクトを1つのサーバーで実現できるととても便利なので、実施方法についてご紹介します。

Django+Gunicorn+Nginx

追加するファイル等

≪Django≫

新規プロジェクト(django-admin startproject ◎◎◎)

※◎◎◎:新規プロジェクト名

≪Gunicorn≫

◎◎◎.socket :socketファイル

◎◎◎.service:serviceファイル

≪Nginx≫

設定ファイルの変更のみ必要で、追加ファイル等は不要!

嬉しいことに、意外と簡単に複数プロジェクトを設定できそうですね。

1.新規プロジェクトの作成

前項までで紹介してきたように、新規プロジェクトの作成方法は変わりません。

手順1.

“root”権限を取得します。

su -l

パスワードを入力し、”root”権限を取得します。

手順2.

新規Djangoプロジェクトを作成します。

cd /home

「home」ディレクトリへ移動します。

source ★★★/bin/activate

仮想環境を有効化します。

django-admin startproject ◎◎◎

新規プロジェクトを作成します。

※◎◎◎:プロジェクト名

手順3.

新規プロジェクトにおける「settings.py」の設定を実施して下さい。

【STATIC_ROOT】と【MEDIA_ROOT】のディレクトリは既存プロジェクトと重複しないようにしましょう。

設定が完了すれば、いつもと同様に登録を行います。

sudo python manage.py collectstatic

静的ファイルを指定ディレクトリに集約コピーします。

python manage.py makemigrations

マイグレーションファイルを作成します。

python manage.py migrate

マイグレーションファイルをデータベースに適用します。

python manage.py createsuperuser

スーパーユーザーを作成します。

python manage.py runserver [ポート]: を実行し、ロケット画面が表示されればOKです。

2.Gunicorn設定(systemctlコマンドの登録)

systemctlとして登録を行う「socketファイル」の作成を行います。

sudo vi /etc/systemd/system/◎◎◎.socket

新規プロジェクト用に「socketファイル」を作成します。

◎◎◎:プロジェクト名

新規Djangoプロジェクト内に「sockファイル」を自動作成させましょう。

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/home/◎◎◎/◎◎◎.sock

SocketUser=■■■(ユーザー名)

[Install]
WantedBy=sockets.target

systemctlとして登録を行う「serviceファイル」の作成を行います。

sudo vi /etc/systemd/system/◎◎◎.service

新規プロジェクト用に「service」ファイルを作成します。

※◎◎◎プロジェクト名

新規DjangoプロジェクトをWSGI仕様に準拠したGunicornで起動するためのコマンドを登録しておきます。

[Unit]
Description=gunicorn daemon
Requires=◎◎◎.socket
After=network.target

[Service]
User=■■■(ユーザー名)
Group=□□□(グループ名)
WorkingDirectory=/home/◎◎◎/
ExecStart=/home/★★★(仮想環境名)/bin/gunicorn –workers 3 –bind /home/◎◎◎/◎◎◎.sock ◎◎◎.wsgi:application

[Install]
WantedBy=multi-user.target

Gunicornの設定が完了すれば、再起動させて反映させましょう。

sudo systemctl daemon-reload

下記操作を実施する前に、Daemonの再読み込みを実施します。

sudo systemctl restart ◎◎◎.service

Gunicornの再起動コマンド

3.Nginx設定(設定ファイルの更新)

Nginxも独自の設定ファイルを変更します。

ここでは前項までに作成した設定ファイルに対して追記していきます。

vi /etc/nginx/conf.d/☆☆☆.conf

独自の設定ファイルを変更します。

☆☆☆:既存プロジェクト名

server {
 listen 443 ssl;
 server_name ▼▼▼(ホスト名);

 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/☆☆☆/☆☆☆.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 【重複しないポート番号】 ssl;
 server_name ▼▼▼(ホスト名);

 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/◎/.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;
 }
}

重複しないポート番号を設定しましょう。

※実施前にファイアウォールにおいて使用するポート番号を開放しておいて下さい。

systemctl restart nginx

Nginxを再起動させます。

systemctl status nginx

起動状況を確認します。

これで複数プロジェクトの登録(関連付け)は完了です。

まとめ

Webアプリケーションを作成するにあたり、環境構築の選別がとても重要なファクターになってきます。

ここで紹介している内容は、全てのサーバー、OSで使用できないかもしれませんが、どのような理論で、何を設定すれば良いのかは共通の概念なので参考に出来るかと思います。

今後もよりいっそうWebアプリケーションの需要が高くなってくると思いますので、何かの参考になればと思います。

 

それでは、満足のいくWebアプリケーションの作成に奮闘してみて下さい!