ジャコ Lab

プログラミング関連のメモ帳的ブログです

FastAPI のサーバーについて

実行例、最近変わった?

GitHub の README を見ていると以下のようになっています

$ fastapi dev main.py

あれ?こんなんでしたっけ?

FastAPI CLI なるものが追加されていた

github.com

v0.111.0 で FastAPI CLI なるものが追加されていました。
2024年5月頃から変わったようですね。

ドキュメントの説明では Uvicorn だけどね

ここ では、まだ Uvicorn でした。

$ uvicorn main:app --reload

そもそも Uvicorn って何?

本番環境では、Uvicorn または、 Hypercornのような、 ASGI サーバーが必要になります。

という説明がある通り、FastAPI を動かすには Uvicorn などが必要になります。

というか、ASGI サーバーってなんじゃい!

ASGI サーバーとは

この辺は ChatGPT の出番です
質問
FastAPI の実行に必要な ASGI サーバーってなんですか?
ChatGPT の回答
FastAPI を実行するには、ASGI (Asynchronous Server Gateway Interface) サーバーが必要です。ASGI サーバーは、FastAPI のような非同期の Python Web フレームワークを実行するための標準的なインターフェースを提供するサーバーです。最も一般的に使われる ASGI サーバーの例は次の通りです。
  • Uvicorn: FastAPI の公式ドキュメントでも推奨されている ASGI サーバーです。軽量かつ高速で、シンプルに利用できるのが特徴です。
  • Daphne: Django チャンネル (Django Channels) プロジェクトによって開発され、特に WebSocket やリアルタイム通信に優れています。
  • Hypercorn: Quart フレームワークと一緒に使われることが多い別の ASGI サーバーですが、FastAPI とも互換性があります。
ASGI サーバーは WSGI (Web Server Gateway Interface: Flask や Django が従来使っている同期型のインターフェース) の進化形であり、WebSocket などの非同期処理をサポートするために設計されています。FastAPI のような非同期処理に強いフレームワークでは、この ASGI サーバーがパフォーマンスを発揮します。
なるほどなるほど。Flask では WSGI を使ってて、ASGI は WSGI の強い版ってことか

Uvcorn vs Hypercorn

質問
Uvicorn と Hypercorn の違いを教えてください
ChatGPT の回答

Uvicorn と Hypercorn はどちらも ASGI サーバーであり、FastAPI などの非同期 Python フレームワークを実行するために使用されます。両者は似た役割を果たしますが、いくつかの違いがあります。

1. 開発元と設計理念

Uvcorn
  • 開発者: Tom Christie(Starlette フレームワークの開発者)
  • 設計理念: 軽量かつシンプルなサーバーで、特にパフォーマンスに優れた非同期処理に最適化されています。主に FastAPI や Starlette と一緒に使われることが多いです。
  • 特徴: シンプルさを重視し、依存関係を少なくしています
Hypercorn
  • 開発者: Quart フレームワークの開発者
  • 設計理念: 高機能でフレキシブルなサーバーとして設計されています。複数のプロトコルや設定オプションを提供し、より複雑なニーズに対応可能です。
  • 特徴: より多くのプロトコルをサポートし、カスタマイズ性が高いのが特徴です。

2. プロトコルサポート

Uvicorn:
  • 主に HTTP と WebSocket に対応しています。
  • HTTP/2 はサポートしていません(httptools に依存)。
Hypercorn:
  • HTTP/1.1, HTTP/2, HTTP/3、そして WebSocket をサポートしています。
  • より幅広いプロトコルを扱えるため、特殊な要件があるプロジェクトに適しています。

3. 使用する I/O ライブラリ

Uvicorn:
  • uvloop と httptools に基づいており、非常に高速で、特にパフォーマンス重視のアプリケーションに向いています。
  • 標準で uvloop を使うことで、イベントループを最適化し、パフォーマンスを向上させています。
Hypercorn:
  • asyncio, uvloop, trio, curio など複数のイベントループをサポートしています。プロジェクトのニーズに応じて異なるイベントループを選べる柔軟性があります。

4. パフォーマンス

Uvicorn:
  • よりシンプルで高速な実行が可能です。特に uvloop を使うことで、同期的な HTTP/1.1 処理で高いパフォーマンスを発揮します。
Hypercorn:
  • Uvicorn よりも若干複雑なため、パフォーマンスが多少劣る場合もありますが、複数のプロトコルサポートや柔軟な設定が求められる場合に強みを発揮します。

5. カスタマイズ性

Uvicorn:
  • シンプルな設定で使いやすいですが、機能が限られており、複雑なカスタマイズには向いていません。
Hypercorn:
  • 幅広い設定オプションを提供しており、特にプロトコルやイベントループの選択肢が多いため、複雑なプロジェクトに適しています。

結論

  • Uvicorn はシンプルでパフォーマンス重視のプロジェクトに最適です。特に FastAPI や Starlette で使う場合には推奨されます。
  • Hypercorn は HTTP/2 や HTTP/3 を必要とする、または特定のイベントループやプロトコルサポートが必要な場合に適しています。カスタマイズ性が高く、複雑なニーズに対応できます。
HypercornはどちらかというとQuartの標準であることがわかった。
そして、Uvicorn より Hypercorn の方が強いことがわかった

Gunicorn って何?

質問
Gunicorn って何?
ChatGPT の回答

Gunicorn は、PythonWSGI (Web Server Gateway Interface) サーバーの一つで、"Green Unicorn" の略です。Flask や Django などの WSGI ベースのフレームワークで Web アプリケーションを動かすために広く使われています。

Gunicorn の特徴

WSGI サーバー:
  • Gunicorn は同期型の WSGI サーバーで、Python の Web アプリケーションフレームワークと Web サーバー(Nginx や Apache)との間で通信を行います。
  • WSGI は同期的なリクエスト/レスポンスサイクルに適しており、非同期やリアルタイム通信(例: WebSocket)には対応していません。
簡単なデプロイ:
  • Gunicorn は設定が簡単で、Flask や Django アプリをすばやくデプロイするのに適しています。通常、Nginx などのリバースプロキシサーバーと組み合わせて使われます。
マルチプロセスとワーカーモデル:
  • Gunicorn は複数のワーカーを生成して並列にリクエストを処理できるため、高トラフィックなサイトに向いています。
  • 同期型ワーカー、非同期型ワーカー、Gevent ワーカー、Tornado ワーカーなど、複数のワーカーモデルをサポートしています。
シンプルで堅牢:
  • Gunicorn は堅牢なサーバーとして定評があり、シンプルな構成でも安定したパフォーマンスを提供します。特に設定をあまり細かくいじらずにデプロイを簡略化したい場合に便利です。
なるほどわからん、FastAPI は ASGI なのに WSGI の Gunicorn を使うケースがあるの?

FastAPI で Gunicorn を使うメリットとは?

質問
FastAPI で Gunicorn を使うメリットとは?
ChatGPT の回答

FastAPI で Gunicorn を使用する場合、メリットがありますが、いくつかの特定の条件に基づいて利用されることが多いです。FastAPI は本来、非同期の処理をサポートしているため、Uvicorn などの ASGI サーバーと組み合わせるのが通常ですが、Gunicorn と組み合わせるメリットは次のような点があります。

1. Gunicorn のプロセス管理

  • Gunicorn のワーカープロセスモデル: Gunicorn はマルチプロセスで動作するため、複数のプロセスを使って並列にリクエストを処理できます。これにより、CPU を複数コアに渡って効率的に利用でき、トラフィックが多いアプリケーションでもスケールしやすくなります。
  • ワーカー数の調整: Gunicorn では、ワーカー(プロセス)の数を簡単に指定できます。これにより、サーバーリソースに応じたプロセス管理を柔軟に行えるため、高負荷のアプリケーションに適しています。

2. 非同期と同期の両立

  • Gunicorn + Uvicorn の組み合わせ: FastAPI は非同期処理を得意としていますが、Gunicorn と Uvicorn を組み合わせることで、Gunicorn のプロセス管理能力と Uvicorn の非同期処理性能を両方活用できます。これにより、マルチプロセスの安定性と非同期の高速パフォーマンスを同時に実現できます。Gunicorn 自体は同期的な WSGI サーバーですが、Uvicorn を Gunicorn のワーカーとして使うことで、非同期 ASGI アプリをサポートします。

3. 大規模アプリケーションのデプロイに便利

  • 堅牢なデプロイ: Gunicorn は多くのプロジェクトで使われており、信頼性が高く、特に大規模な商用アプリケーションのデプロイに適しています。また、Gunicorn はシグナル処理やワーカープロセスの監視機能が備わっており、障害時にも自動的にワーカーを再起動する機能があります。
  • ロードバランシング: Gunicorn はワーカープロセス間でリクエストを均等に分散させることができ、負荷の高いアプリケーションに対して負荷分散を効果的に行えます。

4. 互換性

  • Nginx や Apache との容易な統合: Gunicorn は多くの Web サーバー(Nginx や Apache)と簡単に統合できます。Nginx をリバースプロキシとして使い、Gunicorn が内部で FastAPI アプリケーションを処理する構成は非常に一般的です。これにより、リクエストの効率的な処理と負荷分散が実現できます。

5. 同期 API や古いエコシステムとの統合

  • 同期処理のサポート: FastAPI は非同期処理が基本ですが、Gunicorn を使うことで、同期処理を含むアプリケーションでも安定して動作させることができます。例えば、古い同期的なライブラリを使用する部分がある場合でも、Gunicorn はその処理をうまく扱うことができます。

デメリットや注意点

  • 非同期性能の制限: Gunicorn 自体は同期的なサーバーのため、単体で使用した場合、FastAPI のような非同期アプリケーションのフルパフォーマンスは発揮できません。そのため、通常は UvicornWorker を使って非同期処理をサポートさせます。
  • 複雑な構成: FastAPI をデプロイするために、Gunicorn と Uvicorn の組み合わせを使用すると、設定がやや複雑になる可能性があります。特に大規模アプリケーションの場合、Gunicorn の設定や調整が必要です。

結論

FastAPI で Gunicorn を使う最大のメリットは、Gunicorn のプロセス管理機能やワーカーモデルを活用し、信頼性の高いデプロイを実現できることです。さらに、Gunicorn に Uvicorn のワーカーを組み合わせることで、FastAPI の非同期処理性能も最大限に引き出すことができます。

なるほど、マルチプロセスの効果は高そうだ

まとめ

The command fastapi dev reads your main.py file, detects the FastAPI app in it, and starts a server using Uvicorn.

なお、上記注釈の通り、fastapi dev main.pyは、内部で uvicorn を使っているようです