
GunicornはGreen Unicornの略で、Benoit ChesneauらがRubyのUnicornを参考に2010年頃から開発したPython製のWSGIサーバである。preforkモデルを採用しシンプルな運用と高い信頼性を両立しており、Django、Flask、FastAPI(ASGIワーカー経由)など幅広いPython Webアプリの本番稼働を担っている。本稿ではGunicornの成り立ち、内部構造、設定の勘所、Uvicornなど他サーバとの関係を整理する。
この記事の目次
- Unicornから着想を得たPythonサーバ
- preforkマスター・ワーカーの仕組み
- 本番運用で押さえる設定
- uWSGIやUvicornとの位置づけ
- まとめ
Unicornから着想を得たPythonサーバ

RubyのUnicornは2009年頃にEric Wongが公開したpreforkモデルのRack準拠サーバで、マスター・ワーカー構成とOSの仕組みを素直に活用する設計から、本番運用での安定性で評価を得ていた。Benoit ChesneauはこれをPythonのWSGI仕様(PEP 3333)向けに移植する形でGunicornを書き、2010年に最初のリリースを行った。
Gunicornの基本方針は「アプリケーションコードに依存しない、シンプルでUnix的なWSGIサーバ」である。依存ライブラリを極力減らし、設定はコマンドラインオプションかPythonの設定ファイルで指定する。デーモン化や再起動はOSのプロセス管理機構やsystemd、Supervisorに任せ、自身は確実にWSGI契約を満たすことに集中する。
preforkマスター・ワーカーの仕組み

Gunicornは起動するとマスタープロセスが指定数のワーカーをforkし、各ワーカーがソケットからリクエストを受け取る。リクエスト処理はワーカー内のWSGIアプリで完結し、結果をクライアントへ返す。マスターはワーカーの健全性を監視し、ハングや異常終了を検知すると新しいワーカーを起こす。ローリング再起動のHUPシグナルや、SIGUSR2による無停止アップグレードも可能である。
ワーカー種別はsync、gthread、gevent、eventlet、tornado、そしてASGI向けのuvicorn.workers.UvicornWorkerなどから選べる。デフォルトのsyncはI/Oが軽い場合に最も予測しやすく、I/O待ちが長いアプリではgthreadやgeventで並行度を上げる。FastAPIのようなASGIアプリはUvicornWorkerを介してGunicornのプロセス管理機能だけを借りる構成が定番になっている。
本番運用で押さえる設定

ワーカー数は経験的に2 * CPU数 + 1が出発点とされる。CPUバウンドな処理が多いか、I/O待ちが支配的かで前後させる。--threadsを併用する場合は1ワーカーあたりのメモリ消費も観察する。リクエストタイムアウトは--timeoutで指定し、長時間処理はCeleryなどのジョブキューに逃がすのが基本である。
本番ではGunicorn単体ではなく前段にNginxやCaddy、HAProxyを置き、TLS終端、HTTP/2、静的ファイル配信を任せるのが定石である。Gunicornは内部ネットワーク上でHTTP/1.1を喋り、リバースプロキシ経由のクライアント情報はforwarded-allow-ipsとX-Forwarded-*で取り扱う。ロギングはアクセスログとエラーログを分け、構造化ログにする場合は--access-logformatをカスタマイズする。
uWSGIやUvicornとの位置づけ

uWSGIは2009年頃にRoberto De Ioris(Unbit社)が公開した多言語対応のサーバで、機能が極めて豊富である一方、設定が複雑で学習コストが高い。GunicornはこれにくらべてPython専用に絞り込み、オプションは少ないが落とし穴が少ないため、シンプルなWSGIスタックでは第一選択になりやすい。
近年はFastAPIなどASGIアプリの普及に伴い、UvicornやHypercornが直接サーバとして使われる場面も増えた。ただしGunicornのprefork管理機能は依然として優れているため、gunicorn -k uvicorn.workers.UvicornWorkerの組み合わせは本番運用の定番として残っている。Uvicornの速度とGunicornのプロセス管理を併せて享受できる構成である。
まとめ
GunicornはPython Webアプリを安定して動かすためのpreforkサーバとして、長く広く使われてきた。シンプルな設定と確かなプロセス管理機能を持ち、UvicornWorker経由でASGI時代にも適応している。リバースプロキシと組み合わせる構成を押さえれば、Pythonバックエンド運用の信頼できる土台となる。
※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

コメント