サーバーを手動で実行する¶
fastapi runコマンドを使用する¶
要するに、FastAPIアプリケーションを動作させるにはfastapi runを使用します
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u>
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting production server 🚀
Searching for package file structure from directories
with <font color="#3465A4">__init__.py</font> files
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font>
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> 🐍 main.py
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with
the following code:
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u>
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font>
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000/docs</u></font>
Logs:
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>2306215</b></font><b>]</b>
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete.
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://0.0.0.0:8000</u></font> <b>(</b>Press CTRL+C
to quit<b>)</b>
これはほとんどの場合に機能します。 😎
このコマンドは、例えばコンテナ、サーバーなどでFastAPIアプリを起動するために使用できます。
ASGIサーバー¶
もう少し詳しく見てみましょう。
FastAPIは、ASGIと呼ばれるPythonウェブフレームワークとサーバーを構築するための標準を使用しています。FastAPIはASGIウェブフレームワークです。
リモートサーバーマシンでFastAPIアプリケーション(または他のASGIアプリケーション)を実行するために必要な主なものは、UvicornのようなASGIサーバープログラムです。これはfastapiコマンドにデフォルトで付属しています。
いくつかの代替案があります。
- Uvicorn: 高性能なASGIサーバー。
- Hypercorn: HTTP/2やTrioなどの機能と互換性のあるASGIサーバー。
- Daphne: Django Channels用に構築されたASGIサーバー。
- Granian: Pythonアプリケーション用のRust HTTPサーバー。
- NGINX Unit: NGINX Unitは軽量で多機能なウェブアプリケーションランタイムです。
サーバーマシンとサーバープログラム¶
名前に関する小さな詳細を覚えておいてください。💡
「サーバー」という言葉は、リモート/クラウドコンピューター(物理的または仮想マシン)と、そのマシン上で実行されているプログラム(例:Uvicorn)の両方を指すのに一般的に使用されます。
一般的に「サーバー」という言葉を読むときは、これら2つのうちのどちらかを指す可能性があるということを覚えておいてください。
リモートマシンを指す場合、サーバー、マシン、VM(仮想マシン)、ノードと呼ぶのが一般的です。これらはすべて、通常Linuxが稼働しており、プログラムを実行する何らかのリモートマシンを指します。
サーバープログラムをインストールする¶
FastAPIをインストールすると、本番環境サーバーであるUvicornが付属しており、fastapi runコマンドで起動できます。
しかし、ASGIサーバーを手動でインストールすることもできます。
仮想環境を作成し、アクティベートしてから、サーバーアプリケーションをインストールしてください。
例えば、Uvicornをインストールするには
$ pip install "uvicorn[standard]"
---> 100%
他のASGIサーバープログラムにも同様のプロセスが適用されます。
ヒント
standardを追加することで、Uvicornは推奨される追加の依存関係をインストールして使用します。
これには、asyncioの高性能なドロップイン代替品であるuvloopが含まれ、大きな並行処理性能の向上をもたらします。
pip install "fastapi[standard]"のような形でFastAPIをインストールすると、uvicorn[standard]も同時に取得されます。
サーバープログラムを実行する¶
ASGIサーバーを手動でインストールした場合、FastAPIアプリケーションをインポートするために、通常は特別な形式のインポート文字列を渡す必要があります。
$ uvicorn main:app --host 0.0.0.0 --port 80
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit)
Note
uvicorn main:appコマンドは以下を指します。
main: ファイルmain.py(Pythonの「モジュール」)。app:main.py内でapp = FastAPI()の行で作成されたオブジェクト。
これは以下と同等です
from main import app
各代替ASGIサーバープログラムには同様のコマンドがあり、それぞれのドキュメントで詳細を読むことができます。
Warning
Uvicornや他のサーバーは、開発中に役立つ--reloadオプションをサポートしています。
--reloadオプションは、より多くのリソースを消費し、より不安定です。
開発中には非常に役立ちますが、本番環境では使用すべきではありません。
デプロイのコンセプト¶
これらの例は、サーバープログラム(例:Uvicorn)を起動し、単一のプロセスを開始し、すべてのIP(0.0.0.0)で定義済みのポート(例:80)をリッスンします。
これが基本的な考え方です。しかし、おそらくいくつかの追加事項に注意を払う必要があるでしょう。
- セキュリティ - HTTPS
- 起動時の実行
- 再起動
- レプリケーション(実行中のプロセス数)
- メモリ
- 起動前の事前準備
これらの各概念について、どのように考えるべきか、そしてそれらを処理するための具体的な戦略の例を次の章で詳しく説明します。🚀