複数のDjangoのアプリを同じサーバーからデプロイする方法

皆さん、こんにちは!

Djangoのアプリはデプロイできたけど、複数のDjangoアプリを同じサーバーからデプロイしたいという方に是非読んでほしい記事です。

Djangoのアプリのデプロイができたら複数のDjangoアプリをデプロイすることも特に難しいことはないので是非チャレンジしてください。

今日の環境

Ubuntu 22.04のインストールされたサーバー

SSHで接続できる状態

Djangoアプリが一つデプロイされている状態

詳しいDjangoのデプロイについては下記の記事から進めてください。

Djangoがデプロイができたらこの記事に戻ってきましょう!

今日はticketauthという名前のアプリをデプロイします。

あと、Linuxのコマンド(Bash)が少しわかっている方が理解しやすいです。

今日のスタック

今日は上記の記事で紹介したNginxをウェブサーバー、GunicornをWSGIのアプリケーションサーバーとして使用したものに2つ目のDjangoを追加するようにします。

Djangoがデプロイできた状態でさらにもう一つDjangoのアプリを同じサーバーからデプロイするような形で進めます。

ユーザーがアクセスする方法

同じサーバーに複数のドメイン(なんとか.comとか)でそれぞれのDjangoアプリに誘導する方法もあります。

今日は今使っている80番のポートがあるので81番のポートを開けてユーザーがIPアドレスから2つ目のDjangoアプリにアクセスできるようにします。

Djangoアプリをアップロード

では、自身で作成したDjangoアプリ(2つ目)をアップロードしましょう。

場所はどこでもよいですが、前回はhome/user名の直下に置いたので同じ階層に置きます。

ticketapiが前回デプロイしたものです。

tikcetapiAuthが今アップロードしたばかりのものでこれからデプロイします。

下準備

では、前回の記事を参考にしながら、下記のDjangoの下準備を進めましょう。

  • Django用に仮想環境を作成
  • 仮想環境をアクティベート
  • pipでDjangoプロジェクトのライブラリをインストール
  • Settings.pyのコンフィグ設定
  • DBの設定(PostgreSQLに接続)
  • Staticファイルの扱い
  • データベースのマイグレーション
  • スーパーユーザーの作成
  • collectstaticの実行
  • ファイヤーウォールの設定
  • Djangoのテストサーバーでテスト
  • Gunicornを使ってテスト

Gunicornの設定ファイルの作成

ではDjangoのテストサーバーでIPアドレスからアクセスして問題がないようでしたら、2つ目のDjango用に新しくGunicornの設定ファイルを作成します。

今回使うのは、SocketファイルとServiceファイルです。

Gunicornのソケットファイルの作成

前回の記事でgunicorn.socketファイルを作成しているので2つ目のアプリ用と分かるような名称にして.socketファイルを作成します。

sudo nano /etc/systemd/system/ticketauth.socket

#ticketauthは自分で好きな名称に変えてください。

中身はこんな感じになります。

[Unit]

Description=gunicorn socket



[Socket]

ListenStream=/run/ticketauth.sock



[Install]

WantedBy=sockets.target

Gunicornのサービスファイルの作成

サービスファイルはGunicornがDjangoのファイルをプロセスするためのコンフィグファイルになります。

テストサーバー(python manage.py runserver)の本番用という事ですね。

では下記のコマンドでサービスファイルを作成します。

sudo nano /etc/systemd/system/ticketauth.service

中身はこのような感じです。

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

[Service]
User=dan
Group=www-data
WorkingDirectory=/home/dan/ticketapiAuth
ExecStart=/home/dan/ticketapiAuth/env/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/ticketauth.sock \
          djangoapi.wsgi:application

[Install]
WantedBy=multi-user.target

次に下のコマンドでGunicornソケットを実行します。これで自動でソケットファイルが作成されます。

sudo systemctl start ticketauth.socket

次にこれをEnable(実行:オン)にします。これで、ソケットに接続された際にsystemdが自動でgunicorn.socketを実行して処理してくれるようになります。

Gunicorn Socketファイルを確認しよう

gunicorn.socketをアクティブにします。

sudo systemctl enable ticketauth.socket

では下記のコマンドでプロセスのステータスを確認しましょう。

sudo systemctl status ticketauth.socket

これで前回デプロイしたDjangoアプリのGunicornファイルとは別に新しいGunicornのサービスが実行できました。

Nginxのコンフィグ設定

では前回の記事同様にこちらのDjangoアプリに対してのコンフィグファイルを作成していきます。

sudo nano /etc/nginx/sites-available/ticketauth

中身はこんな感じです。

server {
    listen 81;
    server_name 172.104.81.40;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/dan/ticketapiAuth;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/ticketauth.sock;
    }
}






このファイルができたらシンボリックリンクでsites-enabledディレクトリとリンクしてあげます。

sudo ln -s /etc/nginx/sites-available/ticketauth /etc/nginx/sites-enabled

では、nginxのコンフィグレーションをテストしてみましょう。

sudo nginx -t

ここでエラーがでなければ、再度nginxをリスタートします。

sudo systemctl restart nginx

81ポートを開放する

今回はIPアドレスからの接続を許可させるので、それに使う81番ポートを開けます。

sudo ufw allow 81/tcp

Djangoアプリにアクセスする

ではIPアドレスとポートをブラウザに入力してサイトが見れるか確認します。

で80番の方も問題なくアクセスできます。

おめでとうございます!

これで1つのサーバーから2つのDjangoアプリをデプロイすることができました。

1 thought on “複数のDjangoのアプリを同じサーバーからデプロイする方法”

  1. 匿名でコメントを頂きました。ありがとうございます。
    両方のDjangoインスタンス(アプリ)で片方にログインするともう片方でログアウトされるという現象が起きるという事です。
    これをDjangoのアドミンパネルと認識すると、同じデータベースにアクセスしているのでセッションが切れているように考えられます。
    Djangoのデータベースにあるセッションはブラウザのクッキーを保管しているのでそれぞれのブラウザとそのサイトの情報を監視しているはずです。

    対応策として、①ログインの方法(セッションベース)を変え他の方法でログインさせる。同じドメインをreverse proxyでstaff.store.comとcustomer.store.comにし同じポート/ドメインを共有させる。

    しかし、規模が大きくなるにつれてDjangoだけでアドミンパネルの管理とフロントエンドの制作は限界が出てきます。
    (特にSPAが難しいのでURLが変わるごとにページがリフレッシュされてしまいUXが弱いです。)
    そこでReactやVueを使い、別々に分けていくことをお勧めします。

    特にデータベースを複数のアプリで共有するならREST APIにした方が管理がしやすくなります。
    分からない部分があれば是非聞いてください。
    よろしくお願いいたします。

Comments are closed.