DjangoやFlaskなどのPythonアプリケーションをデプロイする際に使うGunicorn(ジーユニコーン)。
デプロイはできたけど、実際にどのような役目をしているのか分かりづらいですよね。
今日はGunicornについて紹介していきます。
Gunicornの定義
Gunicornの公式サイトに記載されているものを翻訳します。
Gunicorn もしくは緑のユニコーンとはPythoinのWSGI HTTPサーバーでUnixの為に作られました。これはPre-Forkワーカーモデルです。(※各ワーカーをアプリケーションごとに割り当てロードに必要なキャパシティ以上を割り当てる)
Gunicornは様々なウェブフレームワークに対応し、簡単に実装でき、サーバーに負担のかからない、軽量なサーバーになります。
Gunicornができた経緯
Unixのアプローチとして、毎回アプリケーションのデプロイをするたびに下記の作業が必要でした。
- スタティックファイル(静的ファイル)のホスティング
- Http接続の扱い
- サーバーがクラッシュしたときの回復作業
- アプリケーションのスケール化の対応
以上の作業がアプリケーションのデプロイごとに必要になりとても時間がかかります。
それを解決するのがGunicornです。
サーバーの仕組みを理解する
Pythonのウェブアプリケーションのデプロイには下記の3つのスタックが必要になります。
- ウェブサーバー(Nginxとか)
- WSGIアプリケーションサーバー(Gunicornとか)
- アプリケーション(Djangoとか)
ウェブサーバーはユーザーからのリクエストを受け、ドメインロジックとHTTPコネクションを担当します。ウェブサーバーは正しいリクエストだけを判別し、実際のDjangoアプリ等に渡してあげることが役目になります。
Django等のアプリケーションは各リクエストに対してリスポンスをすることしかできないことを理解しておきましょう。
ではアプリケーションサーバー(Gunicorn)の役目をこれから説明します。
Web Server Gateway Interface(WSGI)とは
PEP3333で記載されているように、Python Web Server Gateway Interface (WSGI)はウェブサーバーとPythonアプリケーションが正しく通信できるためのサーバーになります。
Djangoの例ですと、プロジェクトファイルの中にwsgi.py fileがあります。
このファイルがGunicornにより実行されオブジェクトを定義します。このオブジェクトがリクエストのデータに従い、リスポンスのデータとしてウェブサーバー側に返されるようになります。
GunicornはDjango等のウェブアプリケーションの複数のインスタンスを監視し健康な状態に保ってくれます。例えば、必要に応じてインスタンスの再起動、サーバーに入ってくるリクエストの分配、ウェブサーバーとのコミュニケーションを行います。
また、Gunicornはこれらの作業が早く、最適化されていると評価されています。
WSGIサーバーとしてのGunicorn
Gunicornは複数のウェブサーバーと交信ができます。またGunicornはどのウェブサーバーを使っているかも気にしません。(例えばNginxとかApacheとか)
GunciornはWSGIサーバーとしてウェブサーバーとコミュニケーションが取れることだけと条件としています。
GunicornはウェブサーバーとPythonアプリケーションの間に入り下記の問題を解決してくれます。なので自身で解決策を探す必要がありません。
- 複数のウェブサーバーとコミュニケーションする
- 大量のウェブリクエストに対する対応と、ロードバランスの分散
- 複数のウェブサプリケーションのプロセスを実行しておく
まとめ
Ptyhonを使ったアプリケーションをデプロイする際にはWSGIサーバーを使用するようにしましょう。そうすることにより、アプリケーションのスケール化を図ることができます。