Open3

PythonのUvicorn (ASGI Webサーバー)について📝

まさぴょん🐱まさぴょん🐱

Uvicorn とは📝

https://github.com/encode/uvicorn?tab=readme-ov-file

https://www.uvicorn.org/

Uvicorn は Python 向けの超高速な ASGI (Asynchronous Server Gateway Interface) Web サーバー です。
非同期フレームワーク(FastAPI・Starlette・Quart など)で書かれたアプリを、本番でも開発でもそのまま動かせる “アプリ⇄ネットワークの橋渡し役” になります。

2025 年 4 月 19 日に最新安定版 v0.34.2 がリリースされたばかりで、細かなバグ修正とホットリロード安定化が含まれています。 (Releases · encode/uvicorn · GitHub)

1. 仕組みと特徴

項目 ざっくり説明
非同期 I/O uvloop(libuv ベースのイベントループ)と httptools を採用し、低レイテンシ・高スループットを実現
プロトコル HTTP/1.1・HTTP/2、WebSocket、Server-Sent Events をネイティブで扱える (Python Application Servers in 2025: From WSGI to Modern ASGI ...)
軽量 & シンプル 実行ファイルは数 MB、設定はほぼ不要。uvicorn app:app ですぐ起動
ホットリロード --reload でコード変更を自動検知(開発用)
ワーカー方式 --workers N でマルチプロセス。本番運用は gunicorn -k uvicorn.workers.UvicornWorker 併用も定番
低依存 & BSD ライセンス 標準プラグインで TLS/静的ファイル/プロキシヘッダー補正などを補完、商用利用も安心

2. 代表的な使い方

# ❶ インストール(推奨: 標準拡張込み)
pip install "uvicorn[standard]"

# ❷ 開発サーバーを起動
uvicorn main:app --reload --host 0.0.0.0 --port 8000

# ❸ 本番 (単体運用)
uvicorn main:app --host 0.0.0.0 --port 80 --workers 4 --log-level info

# ❹ 本番 (Gunicorn 経由で多段化)
gunicorn main:app \
  -k uvicorn.workers.UvicornWorker \
  -b 0.0.0.0:80 \
  --workers 4 --threads 8

ヒント:

  • FastAPI を組み合わせる場合は uvicorn main:app が公式推奨。
  • Docker 化では --proxy-headers --forwarded-allow-ips='*' が役立つ。
  • --lifespan on でアプリの startupshutdown を確実にコール。

3. 他 ASGI サーバーとの比較(抜粋)

サーバー HTTP/2 WebSocket 実装言語 特徴
Uvicorn ✔︎ ✔︎ Python (C 拡張) 現在最も普及。FastAPI デフォルト。
Hypercorn ✔︎ ✔︎ Python Trio や h2 にも対応、設定自由度が高い (2024 Comparing ASGI Servers: Uvicorn, Hypercorn, and Daphne)
Daphne ✖︎ ✔︎ Python Django Channels の公式デフォルト。
Granian ✔︎ ✔︎ Rust 超高速だがまだ若いプロジェクト。

4. 採用シーン & ベストプラクティス

シーン おすすめ理由
FastAPI/Starlette アプリの本番投入 公式ドキュメントでも最適解として紹介。高性能と運用実績が豊富。
WebSocket or HTTP/2 が欲しいリアルタイム API ノンブロッキングで同時接続を効率処理。チャット・IoT 通信に◎。
低メモリ環境 (λ, edge functions, micro VM) 常駐コストが低いため FaaS・サーバーレスとも好相性。

5. よくある落とし穴

  1. 同期コードのブロック
    CPU バウンド処理を直接呼ぶとイベントループが詰まりやすい。await run_in_threadpool() や Celery/BackgroundTasks を活用。
  2. ヘルスチェック
    コンテナ・Kubernetes で使うときは /healthz エンドポイントを自作して readinessProbe を通す。
  3. Gunicorn 併用時の graceful reload
    --reload は開発用。本番は SIGHUP でワーカー再起動する運用が安全。

まとめ

  • Uvicorn = Python ASGI のデファクト標準サーバー
  • 軽量・高速・機能充実で FastAPI / リアルタイム API に最適
  • 最新版 v0.34.2 (2025-04-19) でさらに安定度アップ

これから ASGI フレームワークを採用するなら、まず Uvicorn を軸にインフラ設計を考えるとスムーズですよ。

参考・引用

https://github.com/encode/uvicorn?tab=readme-ov-file

https://www.uvicorn.org/

https://www.issoh.co.jp/tech/details/4843/

まさぴょん🐱まさぴょん🐱

Uvicorn = ASGI アプリ(FastAPI を含む)の実行エンジン📝

“Uvicorn = ASGI アプリ(FastAPI を含む)の実行エンジン” と言えます。
役割の切り分けを整理すると次のようになります。

レイヤ 具体例 主な役割 例え(WSGI の場合)
アプリケーション・フレームワーク FastAPI, Starlette, Django Channels など ビジネスロジック・ルーティング・依存注入などを記述する “アプリ本体” Flask / Django
ASGI サーバー Uvicorn, Hypercorn, Daphne, Granian など ソケットを開いて HTTP/2・WebSocket を受信し、ASGI プロトコルでフレームワークに渡す “実行環境” Gunicorn / uWSGI
プロセス/ホスト OS・Docker・Kubernetes など サーバープロセスを起動し、スケール・ヘルスチェック・ロードバランスを担当 同じ

どうして “実行環境” と呼べるのか

  • ASGI は「イベントループがある前提で、scopereceivesend の 3 つのコールバックでアプリ⇄サーバー間を標準化する仕様」。
  • Uvicorn はその仕様を 具体的に実装 し、
    1. ソケットからリクエストを受け取る
    2. Dict 形式の scope をアプリ(FastAPI)に渡す
    3. アプリが await send() したレスポンスをネットワークに書き戻す
      …というランタイムを担っています。
      → なので「FastAPI を動かすための実行基盤」と言えるわけです。

よくある疑問

質問 答え
Uvicorn がないと FastAPI は動かない? ローカルでは fastapi.TestClient などで擬似実行もできますが、ネットワーク公開には 何らかの ASGI サーバー(Uvicorn など)が必須です。
Gunicorn があれば Uvicorn は不要? Gunicorn は WSGI ベース。ASGI アプリを動かすには -k uvicorn.workers.UvicornWorker という Uvicorn 埋込みワーカー を使う形になります。
複数の ASGI サーバーのどれを選べば? FastAPI 公式ドキュメントがまず Uvicorn を推奨。HTTP/3 や Trio ベースが要件なら Hypercorn、Rust で超高速を求めるなら Granian など、要件に応じて乗り換えも容易です(ASGI 互換なのでコード変更は通常不要)。

まとめ

  • Uvicorn = ASGI プロトコルを実装した軽量・高速サーバー
  • FastAPI = ASGI フレームワーク
  • 組み合わせることで “Web アプリがネットワーク越しに動く完全スタック” が成立
まさぴょん🐱まさぴょん🐱

Python の Uvicorn の読み方は?

読み方(英語)
「Uvicorn」は YOU-vee-corn と発音します。
 └ U と V はアルファベットをそのまま読み上げ、最後は “corn(コーン)” です。
カタカナ表記(参考)
ユーヴィコーン

由来を押さえると覚えやすい

  • uv : 非同期イベントループライブラリ uvloop
  • icorn : WSGI サーバー Gunicorn(Green Unicorn)の語尾
    → 両者を組み合わせた高速 ASGI サーバーという意味で Uvicorn という名前になっています。