盆暗の学習記録

データサイエンス ,エンジニアリング,ビジネスについて日々学んだことの備忘録としていく予定です。初心者であり独学なので内容には誤りが含まれる可能性が大いにあります。

機械学習モデルを動かすWeb APIを作ってみる(2):uWSGIの設定

前回

nigimitama.hatenablog.jp

に引き続き,機械学習モデルを動かすAPIを作っていきます。

今回はアプリを動かすサーバ部分を設定します。

アプリケーションサーバの必要性

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リポジトリ

今回使用したコードはこちらのリポジトリにあります。

github.com