Mitama Advent Calendar 2020の1日目です。
木瓜丸です。
今年は自分と仲間とで作ったPython製のWebフレームワーク『Mitama』ネタでカレンダーを書きます。よかったらみなさんも書いてください(^^)
今回は、そもそもこのフレームワークは何に使うのか、どんなふうに動かすのかを具体例を出しながら解説したいと思います。
Mitamaとは
Github: https://github.com/mitama-org/mitama
Mitamaは、社内システムのような、組織で内部向けに運用するWebシステムを構築するためのフレームワークです。
フレームワークを用いてアプリをPythonパッケージとして作成し、それを配信する様に設定することで、簡単に社内で利用するアプリを内製することができます。また、PyPIにパッケージを公開することでOSSとしてそのアプリをほかの人に使えるようにすることもできます。
(アプリの作り方はまた今度カレンダーに書きたいと思います)
サーバーで動かしてみよう
環境
OS: CentOS
Python: 3.6.8
インストール
$ sudo yum install -y nginx uwsgi
$ sudo pip3 install mitama
Mitamaプロジェクトの作成
Mitamaを動かす単位を「プロジェクト」といいます。適当なディレクトリで次のコマンドを実行することで、プロジェクトを作成できます。
$ mitama new someproject
$ ls someproject
mitama.json
初期状態では、プロジェクトディレクトリ下にはmitama.jsonが設置されています。
mitama.jsonには起動するアプリの設定などを書きます。
{
"apps": {
"mitama.portal": {
"path": "/"
}
}
}
apps下のキーにPythonパッケージ名、その辞書のpathプロパティに配信先のパスを設定します。
uWSGIの設定
まず、uWSGIからMitamaを起動する場合は起動スクリプトを作成する必要があります。プロジェクトディレクトリ(↑の例ではsomeproject/)の中で以下のコマンドを叩いてください。
$ mitama uwsgi
これによって、uwsgi.pyが生成されているかと思います。wsgi-fileにこれを指定してuWSGIを起動することで、uWSGIからMitamaのプロジェクト下のアプリが配信されます。
今回はiniファイルを用いた設定を行いたいと思います。プロジェクトディレクトリ下にuwsgi.iniを設置し、以下の様に書きます。
[uwsgi]
module=uwsgi
callable=application
master=true
socket=/var/run/uwsgi.sock
chmod-socket=666
wsgi-file=uwsgi.py
chdir=/path/to/someproject/
logto=/path/to/someproject/uwsgi.log
パスは適宜変えてください。
今回はlogtoを設定することでエラーやアクセスのログも出力したいと思います。
nginxの設定
/etc/nginx/conf.d/mitama.jsonを作成し、次の様に書き込みましょう。
server{
listen 80;
location / {
include uwsgi_params;
uwsgi_pass unix:/var/run/uwsgi.sock;
}
}
ここらへんの書き方は好き嫌いがあるかと思うので、uwsgi_passの指定だけ忘れないようにしてください。
Systemdから起動
uWSGIを起動するコマンドをサービスとして登録してしまいましょう。
/etc/systemd/system/uwsgi.serviceを作成し、以下の様に書き込んでください。
[Unit]
Description=uWSGI
After=syslog.target
[Service]
ExecStart=/usr/local/bin/uwsgi --ini /var/www/mitama/uwsgi.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
できたらSystemdをリロードし、nginxと一緒に起動しましょう。
$ sudo systemctl daemon-reload
$ sudo systemctl start nginx
$ sudo systemctl start uwsgi
サーバーのアドレスにアクセスしてこのような画面が出たら成功です。
終わりに
uWSGIをnginxで使うのって難しいですよね(^^;
iniの生成まで勝手にコマンドで作れたら楽になるんでしょうか。提案とかあったらコメントやプルリクいただけると飛んで喜びます。
よかったらリポジトリにスター付けてください!
マジで。