Open3
PythonのUvicorn (ASGI Webサーバー)について📝
Uvicorn とは📝
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でアプリのstartup/shutdownを確実にコール。
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. よくある落とし穴
-
同期コードのブロック
CPU バウンド処理を直接呼ぶとイベントループが詰まりやすい。await run_in_threadpool()や Celery/BackgroundTasks を活用。 -
ヘルスチェック
コンテナ・Kubernetes で使うときは/healthzエンドポイントを自作して readinessProbe を通す。 -
Gunicorn 併用時の graceful reload
--reloadは開発用。本番はSIGHUPでワーカー再起動する運用が安全。
まとめ
- Uvicorn = Python ASGI のデファクト標準サーバー
- 軽量・高速・機能充実で FastAPI / リアルタイム API に最適
- 最新版 v0.34.2 (2025-04-19) でさらに安定度アップ
これから ASGI フレームワークを採用するなら、まず Uvicorn を軸にインフラ設計を考えるとスムーズですよ。
参考・引用
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 は「イベントループがある前提で、
scope・receive・sendの 3 つのコールバックでアプリ⇄サーバー間を標準化する仕様」。 -
Uvicorn はその仕様を 具体的に実装 し、
- ソケットからリクエストを受け取る
- Dict 形式の
scopeをアプリ(FastAPI)に渡す - アプリが
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 という名前になっています。