前回
今回はアプリを動かすサーバ部分を設定します。
アプリケーションサーバの必要性
Flask.run()で動くサーバは
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
とWarningが出力される通り,あくまで開発用らしいので
デプロイできるようにサーバを用意します。
選択肢は色々あるようですが,今回はuWSGIを使ってみます。
インストール
公式ドキュメントに従ってpipから入れます。
Quickstart for Python/WSGI applications — uWSGI 2.0 documentation
sudo apt install build-essential python-dev sudo pip3 install uwsgi
起動テスト
以下のようにして起動します。
sudo uwsgi --module=api --callable=app --http-socket=0.0.0.0:80
ここで,--module
の部分には,flaskのアプリが入ったpythonスクリプトのファイル名を指定してください(ここではapi.py
としています)
設定をファイルに記述する
起動時のオプションの指定が面倒なので設定ファイルに記述します。
任意の名前のiniファイル(ここではuwsgi.ini
とします)を作り,以下のような感じに設定します。
[uwsgi] # WSGI moduleをロード(アプリの.pyファイル名を指定する) module = api # set default WSGI callable name callable = app # スレッドごとにアプリ全体を読み込む(メモリ消費は増えるが,これを設定しないとLGBMが動かない) lazy-apps = true # HTTPの80番ポートを使う http-socket = 0.0.0.0:80 # worker/processの数 processes = 4 # 各workerのスレッド数 threads = 2 # logを有効化 logto = ./uwsgi.log # pidをファイルに入れておく pidfile = ./uwsgi.pid # SIGTERMとSIGQUITの意味を反転させる die-on-term = true # memory-reportを有効化 memory-report = true
起動
このiniファイルを読み込んで起動します。
sudo uwsgi --ini uwsgi.ini &
(logtoを指定している場合,uwsgiからの出力は基本的にlogファイルに行くのでバックグラウンドプロセスとして起動したほうが扱いやすいので&
をつけています。)
logについては,logの表示用のターミナルをもう一つ用意して,
tail -f uwsgi.log
とすると監視しやすいです。
リロードと停止
pythonファイルやiniファイルを更新した場合は,アプリをリロードしないと反映されません。リロードはpidfileを使って以下のように行います。
sudo uwsgi --reload uwsgi.pid
停止する場合も同様にpidfileを用います。
sudo uwsgi --stop uwsgi.pid
ちゃんと停止したかどうかを確認するには
ps aux | grep uwsgi
のようにして動作中のプロセスを確認すると良いかと思います。
GitHubリポジトリ
今回使用したコードはこちらのリポジトリにあります。