はじめに
パワプロ2020楽しいですね!1
以前、Djangoで栄冠ナインデータベースを作成しました。
アプリの特性上、Djangoの開発用サーバーで実行してもいいのですが、今はConoHaのVPSに置いています。
Herokuは早々にレコード数が上限に達しました。
栄冠ナインデータベースですが、栄冠ナインの周回プレイは考慮しておらず2その場合はもうひとつVPSを用意しようかと思いましたが、一番安いプランのリソースですら余っているので一つのVPS内に二つのDjangoアプリ3を入れればええやん?ってなりましたが意外と苦戦しました。
ConoHaのVPSとは
今回の環境
※2020/9/24現在
- メモリ 512MB/CPU 1Core
- Djangoテンプレート
- CentOS 7.7
- Apache 2.4.6
- Python 3.6.8
- mod_wsgi
ConoHaのVPSでDjangoアプリを動かす
まず、コードを/home/django/
に格納します。
Djangoテンプレートを使用した場合、単純にソースを/home/django/
配下に配置し、/etc/httpd/conf/httpd.confを以下のように変更することで使えます。
# ファイルの一番下
WSGIScriptAlias / /home/django/sample/sample/wsgi.py
WSGIPythonPath /home/django/sample
<Directory /usr/lib64/python3.6/site-packages/django/contrib/admin/static>
Require all granted
</Directory>
<Directory /home/django/sample/sample>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
# /home/django/sample/sample/wsgi.pyの部分を自分のアプリのwsgi.pyへのパスに変更する
WSGIScriptAlias / /home/django/eikan-database/config/wsgi.py
# 同様に自分のアプリのフォルダに変更する
WSGIPythonPath /home/django/eikan-database
# 変更なし
<Directory /usr/lib64/python3.6/site-packages/django/contrib/admin/static>
Require all granted
</Directory>
# wsgi.pyが入っているフォルダのパスに変更する
<Directory /home/django/eikan-database/config>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
最初からsample用の設定を書き換えることであっさりDjangoアプリが使えるようになります4。
ConoHaのVPSで複数のDjangoアプリを動かす
つまずきポイント
ConoHaのVPSのDjangoテンプレートではApache + mod_wsgiを使っています。
この環境で複数のDjangoアプリを動かそうとググるとすぐ出るのは、WSGIPythonPathを:
で繋げる方法ですが、この方法ではできませんでした。
WSGIDaemonProcessを見てみると、デフォルトは%{GLOBAL}
となっていて2つ以上のDjangoアプリが入っていると、実行時に全部一緒のプロセスになるため、WSGIPythonPathだけを変更してもプロセスが上書きされて同時に複数のDjangoアプリを実行することができないっぽいです。
WSGIDaemonProcessおよびWSGIProcessGroupを分けてあげることによって、mod_wsgi環境で複数のDjangoアプリを実行することができます。
ディレクトリ型の場合
同じように、もう一つのアプリを/home/django/
に格納します。
今回はeikan-database
とeikan-database-2
としています。
※sampleはもともと存在するやつ
/home/django
├── eikan-database
├── eikan-database-2
└── sample
また、この例ではパワプロ2016の栄冠ナイン3周目用のアプリを/201603、
パワプロ2020の栄冠ナイン1周目用のアプリを/202001としています。
こんな感じ↓
/etc/httpd/conf/httpd.confを以下のようにする
# WSGIDaemonProcessのすぐ後ろは任意の名前でおk
# python-pathはそれぞれのアプリのフォルダを指定する
WSGIDaemonProcess endb201603 python-path=/home/django/eikan-database
WSGIDaemonProcess endb202001 python-path=/home/django/eikan-database-2
# WSGIDaemonProcessで指定した名前を指定する
# WSGIProcessGroup %{ENV:PROCESS_GROUP}とすると、プロセスグループ名は、指定された環境変数の値に設定されます。
SetENV PROCESS_GROUP endb201603
WSGIProcessGroup %{ENV:PROCESS_GROUP}
# このアプリのルートディレクトリを/201603とする
WSGIScriptAlias /201603 /home/django/eikan-database/config/wsgi.py
<Directory /home/django/eikan-database/config>
<Files wsgi.py>
Order deny,allow
Allow from all
Require all granted
</Files>
</Directory>
# このアプリのルートディレクトリを/202001とする
WSGIScriptAlias /202001 /home/django/eikan-database-2/config/wsgi.py
<Directory /home/django/eikan-database-2/config>
<Files wsgi.py>
SetENV PROCESS_GROUP endb202001
Order deny,allow
Allow from all
Require all granted
</Files>
</Directory>
こうしておけばこのまま周回を重ねても簡単に増やしていけますね。
/var/www/html
にhtmlファイルを入れて、
https://endb.shimay.uno/
のような感じにリンクを貼っておけば切り替えも楽々。5
サブドメイン型もたぶんこういう感じでプロセス分けてやればいいのかな・・・?(未検証)
終わりに
最初からNginx + uWSGIでやった方が早かったのでは・・・?
もしくはアプリ側でユーザー切り替えとか周回プレイを考慮した作りにしておけば・・・?
Docker使うとか・・・?
VPS使わずローカルで開発用サーバーで動かすとか・・・?