Kensuke Kousaka's Blog

Notes for Developing Software, Service.

uWSGIを用いた本番環境向けFlaskアプリケーションの構築

PythonベースのWebアプリケーションフレームワークであるFlaskだが,今までは作成したPythonスクリプトを直接実行し,クライアントからのリクエストを直接このスクリプトが受け取っていた.ただこのようなFlaskに実装されている組み込みサーバ機能を用いた運用は開発レベルで用いるべきものであり,リリースする段階(本番環境)ではこれを用いるべきではないようだ.

そのため今回は,uWSGIというNginxなどのWebサーバとPython Webアプリケーションとの橋渡しをしてくれるシステムを用い,Nginxでクライアントからリクエストを受け取り,uWSGIを通してPython Webアプリケーションに渡すようなシステムを構築する.これにより本番環境での現実的なFlaskアプリケーションの運用が実現できる.なお,以下に説明するベース環境はArch Linuxを想定したものである.他のディストリビューションで構築する際は,適宜読み替えてほしい.

uWSGIの導入

まずは,uWSGIに関連するパッケージのインストールを以下のコマンドで行う.

$ yaourt -S uwsgi uwsgi-plugin-python

上記の例ではuWSGI本体に加えてPython3系でuWSGIを動かすためのプラグインも導入している.FlaskアプリケーションをPython2系で開発している場合はuwsgi-plugin-pythonの代わりにuwsgi-plugin-python2をインストールする.

uWSGIの設定

Nginxでクライアントからリクエストを受け取り,uWSGIを通じてFlaskアプリケーションに渡すために,uWSGI用設定ファイルの作成とNginxの設定が必要となる.まずはuWSGI用設定ファイルの作成を行う.

uWSGI用設定ファイルの作成

Flaskアプリケーションの本体であるPythonスクリプト,ここではapp.pyとするが,これと同じ階層に新たに拡張子.iniの設定ファイルを作成する.ここではhelloflask.iniとする.そして,この設定ファイルを以下のように編集する.

HelloFlask initialization file for uWSGI

plugins=pythonの部分では,先ほどuWSGIのインストール時にあわせてインストールしたuwsgi-plugin-pythonを利用するように設定している.FlaskアプリケーションをPython2系で開発していてuwsgi-plugin-python2をインストールした場合は,ここをplugins=python2とする.processes=1では,このアプリケーションをどれだけのプロセスで実行させるかを指定できる.

app.pyの手直し

Flaskのrun()メソッドでIPアドレスやポート番号の指定,スレッド処理のフラグをtrueにしているなど,何かしら引数を与えている場合はこれを取り除く.

以上ができたら,次はNginxの設定に移る.

Nginxの設定

nginx.confについてはほぼデフォルトのままだが,userの指定ではuser http http;とし,worker_processesの指定では動作させるマシンスペックに応じて書き換えをし,httpブロックの中のserverブロックの上にinclude /etc/nginx/site-enabled/*.confという記述を追加しておく.

これらができたらnginx.confを保存し,以下のコマンドを実行して二つのディレクトリを作成する.

# mkdir site-enabled site-available

このディレクトリにはWebサービスごとの設定ファイルを入れるのだが,設定ファイルはsite-availableディレクトリ内に作成するようにし,作成した後はこの設定ファイルをsite-enabledにリンクを張って参照するような仕組みにする.

さて,uWSGIで動作させるFlaskアプリケーションのためのNginxサーバ設定だが,site-availableディレクトリ以下に拡張子.confで設定ファイルを作成する.ここではhelloflask.confとする.これを以下のように編集する.

Nginx configuration file for HelloFlask based on u ...

編集できたら,この設定ファイルにリンクを張り,site-enabledディレクトリから参照できるようにしたのちにNginxをリロードする.以下のコマンドを実行する.

# ln -s /etc/nginx/site-available/helloflask.conf /etc/nginx/site-enabled/helloflask.conf
# systemctl reload nginx

以上で設定は完了となる.

以下のコマンドを実行してアプリケーションを起動し,ブラウザでサーバに接続して正常にアクセスできるかの確認を行う.

$ uwsgi --ini helloflask.ini

これでNginxでリクエストを受け取り,uWSGIを介してFlaskに渡されるシステムが構築できた.