Uvicornとは?高速ASGIサーバの特徴と活用法

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 との連携でスケーラビリティを確保してください。