🔰

ASGI対応のFastAPIでWSGIサーバーのGunicornを使う理由

2024/12/05に公開

ASGI対応のFastAPIでWSGIサーバーのGunicornを使う理由 ~FastAPI初心者エンジニアの学び~

こんにちは!FastAPIを触り始めた学生です。
今回は、PythonのWebアプリケーションとサーバーをつなぐ仕組みやツールについて学んだことをお伝えします。特に、「ASGI対応のFastAPIで、なぜWSGIサーバーであるGunicornが使われるのか?」という疑問に深く迫ってみたいと思います。

Webアプリケーションとサーバーをつなぐ仕組み

Webアプリケーションでは、クライアント(例: ブラウザ)からのリクエストを受け取り、処理して応答を返す役割を担うのがWebサーバーです。しかし、PythonのアプリケーションとWebサーバーの間には直接やり取りする仕組みがなく、両者をつなぐ「通訳」が必要です。この「通訳」を規定するのがWSGIASGIというインターフェース規格です。

WSGIとASGIの違い

  • WSGI (Web Server Gateway Interface)

    • PythonアプリケーションとWebサーバーをつなぐ伝統的な規格。
    • 同期処理を前提としており、DjangoやFlaskなどのフレームワークで使用されます。
  • ASGI (Asynchronous Server Gateway Interface)

    • WSGIの進化版。非同期処理をサポートするために作られました。
    • FastAPIやStarletteのような非同期対応フレームワークで使用されます。

FastAPIはASGI対応のフレームワークなので、ASGIサーバー(例: Uvicorn)と組み合わせるのが自然です。
しかし、実際の運用では「ASGIサーバーのUvicornに加えて、WSGIサーバーであるGunicornが使われる」ケースがよくあるらしいです。これが一体なぜなのか、次に調べた結果をもとに考察したいと思います。

GunicornとUvicornの役割

本番環境でFastAPIを運用する際、よく使用されるサーバーソフトウェアには以下の2つがあります:

  • Gunicorn

    • WSGIサーバーの代表格。
    • プロセス管理に優れており、FlaskやDjangoなどのフレームワークで広く使われています。
  • Uvicorn

    • ASGIサーバーの一つで、非同期処理に特化。
    • FastAPIやStarletteとの相性が良好です。

ここで疑問が生まれます。
「FastAPIはASGI対応なのに、なぜGunicornを使うの?」

Gunicornのプロセスマネージャーとしての役割

FastAPIとGunicornは直接互換性がありません。なぜなら、GunicornはWSGI標準を使用しており、FastAPIはASGI標準に準拠しているからです。
しかし、Gunicornには「プロセスマネージャー」としての大きな役割があり、以下のようにUvicornと組み合わせて使用されます。

  1. Gunicornによるプロセス管理
    Gunicornは、複数のワーカー(プロセス)を効率的に管理し、リクエストの負荷を分散します。マルチコアCPUを活用して複数のプロセスを並列実行するため、大量のトラフィックに耐えられる仕組みを提供します。

  2. Uvicornワーカークラスの利用
    Gunicornは、Uvicorn互換のワーカークラスを利用して、ASGI標準のリクエスト処理を可能にします。GunicornがリッスンしたリクエストをUvicornのワーカーに転送し、ASGI対応のFastAPIで処理を行う流れを作ります。

Gunicorn + Uvicornの具体的な仕組み

以下のフローで、GunicornとUvicornが連携します。

  1. GunicornはポートとIPアドレスをリッスン。
  2. 受け取ったリクエストをUvicornワーカークラスに転送。
  3. UvicornワーカークラスがデータをASGI標準に変換し、FastAPIアプリケーションに渡す。
  4. FastAPIがリクエストを処理し、レスポンスを返す。

この構成により、Gunicornのプロセスマネージャーとしての能力と、Uvicornの非同期処理能力を両立することが出来るとの事です。

Gunicorn + Uvicornを使うメリット

  • プロセス管理の安定性
    Gunicornがプロセスマネージャーとして動作することで、効率的なワーカー管理や負荷分散が可能になる。

  • 非同期処理の強みを活かせる
    UvicornがASGI標準に準拠しているため、FastAPIの非同期機能を最大限に活用できる。

  • 拡張性と柔軟性
    Gunicornの設定を利用して、ワーカー数やプロセスの動作を細かく調整可能。

Uvicorn公式ドキュメントの記述

Uvicornの公式ドキュメントでは以下の記載があります。

本番環境のデプロイメントでは、uvicornワーカークラスとともにgunicornを使用することをお勧めします。

FastAPI公式ドキュメントの記述

FastAPIの公式ドキュメントでは以下の記載があります。

Uvicornワーカーを使ったプロセスマネージャとしてGunicorn(またはUvicorn)を使えば、マルチコアCPUを活用して複数のプロセスを並列実行できます。

まとめ

GunicornとUvicornの組み合わせは、FastAPIを運用する際に非常に便利になるとの事です。

  • Gunicornはプロセスマネージャーとして動作し、安定したプロセス管理を実現してくれる。
  • Uvicornは非同期処理を担い、FastAPIのASGI標準に対応してくれる。

この連携により、安定性高速な非同期処理の両方を兼ね備えた運用が可能となるとの事です。
この事からASGI対応のFastAPIでWSGIサーバーのGunicornを使われるのだと考えられます。

同じ疑問を持つ方々にとって、本記事が参考になれば幸いです!

アプリ開発サークル@IPUT

Discussion