MENU

Uvicornとは|高速ASGIサーバの設計と使いどころ

Uvicorn アイキャッチ
Uvicorn

Uvicornは2017年にTom ChristieがStarlette開発と並行して公開した高速なASGIサーバである。libuvベースのイベントループとuvloop、HTTPパーサにhttptoolsを用いることで、PythonのWebアプリとしては屈指の応答速度を実現し、FastAPIやStarletteを本番に乗せる第一選択肢となった。本稿ではUvicornの開発経緯、ASGI仕様との関係、Gunicornとの組み合わせ、運用上の留意点を解説する。

目次

この記事の目次

  1. ASGI仕様とUvicornの誕生
  2. 内部構造と性能特性
  3. Gunicornとの組み合わせと運用
  4. 他ASGIサーバとの比較
  5. まとめ

ASGI仕様とUvicornの誕生

ASGI仕様とUvicornの誕生

Python 3.4で導入されたasyncioと、WebSocketや長時間接続を素直に扱いたいというニーズから、Andrew GodwinらがASGI仕様を策定した。WSGIが同期前提だったのに対し、ASGIはスコープ、レシーブ、センドのシンプルな三要素で同期・非同期、HTTPとWebSocketを統一的に扱う。

Tom Christieは2017年頃からStarletteやAPIStarといった軽量フレームワークを開発するなかで、それらを高速に動かすサーバが必要だった。そこでuvloopとhttptoolsを利用する形でUvicornを実装し、ASGIアプリのリファレンス実装兼本番サーバとして公開した。2018年にSebastián Ramírez が公開したFastAPIがStarletteをベースにしたため、UvicornはFastAPIスタックの定番サーバとなった。

内部構造と性能特性

内部構造と性能特性

Uvicornは標準ではasyncioのイベントループ上で動くが、uvloopをインストールすると自動的にそちらを利用する。uvloopはMagicStack社のYury Selivanovが2016年に公開したlibuvベースの実装で、asyncioと同じAPIを保ちつつ大幅な性能改善をもたらす。

HTTP解析はhttptools(やはりMagicStack製、Node.jsのhttp_parserをPython向けにラップしたもの)が担い、WebSocketはwebsocketsまたはwsprotoの実装を選択できる。リクエストはASGIスコープに変換され、登録されたアプリのコールバックへ受け渡される。アプリはasync defで書かれた関数を組み合わせて応答し、サーバはsendコールバックでレスポンスを送り返す。

Gunicornとの組み合わせと運用

Gunicornとの組み合わせと運用

Uvicorn単体でもuvicorn app:main --host 0.0.0.0 --port 8000のように起動できるが、本番ではgunicorn -k uvicorn.workers.UvicornWorker app:mainの形でGunicornをマスターにする構成が一般的である。Gunicornが提供するpreforkとプロセス監視、Uvicornの高速ASGI実装の組み合わせで、高負荷時の安定性と性能を両立できる。

前段にはNginx、Caddy、Traefikなどのリバースプロキシを置き、TLS終端、HTTP/2、HTTP/3、レート制限を任せる。ヘルスチェック用のエンドポイントをアプリに用意し、ロードバランサからの監視に応答できるようにする。ロギングは構造化ログを推奨し、--log-configで本番用YAMLを読み込ませると運用が安定する。

他ASGIサーバとの比較

他ASGIサーバとの比較

DaphneはDjango Channelsチームが開発した最初期のASGIサーバで、Django連携を主眼に置く。Hypercornはpgjones氏が開発した別の選択肢で、HTTP/2やHTTP/3のサポートを早期から備えている。GraneninはRustベースの新興、と選択肢は徐々に増えている。

それらの中でUvicornはシンプルなCLI、FastAPIスタックとの一体感、uvloop+httptoolsによる性能の組み合わせから、実質的な標準ASGIサーバとして使われている。HTTP/2が必要ならHypercornやCaddy/Traefikで前段終端、Django Channelsを直接動かすならDaphneという棲み分けが現実的である。

まとめ

Uvicornはasyncioエコシステムを背景に生まれた高速ASGIサーバであり、FastAPIやStarletteを本番運用するうえでの主要な選択肢である。Gunicornをマスターにした構成やリバースプロキシとの分担を押さえれば、現代的なPython Webアプリの土台として十分に頼れる。

※本記事はIT用語辞典の手書きドラフトです。公開前に最新情報・出典を確認のうえ加筆修正してください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次