Uvicornとは
Uvicornは、Pythonで書かれた ASGI(Asynchronous Server Gateway Interface) サーバです。軽量で高速な非同期IOを活用し、FastAPI、Starlette、Django(ASGIモード)などのモダンなWebフレームワークと組み合わせて使用されます。
主な特徴
- シングルスレッド・シングルプロセスで動作し、async/await に最適化された設計。
- uvloop と httptools をデフォルトで利用し、ネットワーク処理を高速化。
- 標準的な
--host、--port、--workersオプションで柔軟に設定可能。 - ホットリロード(
--reload)機能により、開発中のコード変更が即座に反映。 - Docker コンテナや Kubernetes との相性が良く、マイクロサービスのデプロイに適している。
基本的な使い方
インストール
pip で簡単にインストールできます。
pip install uvicorn
シンプルなアプリの起動
以下は app.py に定義した最小限の ASGI アプリです。
# app.py
import asyncio
from fastapi import FastAPI
app = FastAPI()
@app.get("/hello")
async def hello():
await asyncio.sleep(0.1)
return {"message": "Hello, Uvicorn!"}
起動コマンドは次の通りです。
uvicorn app:app --host 0.0.0.0 --port 8000
開発モードでの自動リロード
コードを変更した際にサーバを再起動したくない場合は --reload オプションを付与します。
uvicorn app:app --reload
本番環境でのデプロイ
マルチワーカー構成
CPU コア数に合わせて複数ワーカーを立ち上げることで、リクエスト処理能力を向上させます。
uvicorn app:app --workers 4 --host 0.0.0.0 --port 80
Gunicorn + UvicornWorker の組み合わせ
Gunicorn のプロセスマネジメント機能と Uvicorn の非同期性能を併用することも一般的です。
pip install gunicorn
# 起動例
gunicorn app:app -k uvicorn.workers.UvicornWorker -w 4 -b 0.0.0.0:80
トラブルシューティングのポイント
- ポートが既に使用中の場合は
--portを変更。 - uvloop がインストールされていないとパフォーマンスが低下することがあるので、
pip install uvloopを検討。 - HTTPS が必要な場合は、リバースプロキシ(Nginx/Traefik)で TLS 終端を行うのが推奨。
まとめ
Uvicorn は、シンプルさと高速性を兼ね備えた ASGI サーバとして、モダンな Python Web 開発の中心的な位置付けにあります。開発環境では --reload を活用し、本番環境ではマルチワーカーや Gunicorn との連携でスケーラビリティを確保してください。