サーバーの手動実行¶
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のWebフレームワークやサーバーを構築するための標準仕様を使用しています。FastAPIはASGI Webフレームワークです。
リモートサーバーマシンでFastAPIアプリケーション(または他のASGIアプリケーション)を実行するために必要な主なものは、UvicornのようなASGIサーバープログラムです。これはfastapi
コマンドにデフォルトで付属しています。
以下を含むいくつかの選択肢があります
- Uvicorn: 高性能なASGIサーバー。
- Hypercorn: HTTP/2やTrioなどの機能をサポートするASGIサーバー。
- Daphne: Django Channels用に構築されたASGIサーバー。
- Granian: Pythonアプリケーション向けのRust製HTTPサーバー。
- NGINX Unit: NGINX Unitは軽量で汎用性の高いWebアプリケーションランタイムです。
サーバーマシンとサーバープログラム¶
名前について、心に留めておくべき小さな詳細があります。💡
「サーバー」という言葉は、リモートやクラウド上のコンピューター(物理マシンまたは仮想マシン)と、そのマシンで実行されているプログラム(例: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)を実行し、単一のプロセスを開始し、事前定義されたポート(例:80
)ですべてのIP(0.0.0.0
)をリッスンします。
これが基本的な考え方です。しかし、おそらく次のような追加事項にも対処したいと思うでしょう
- セキュリティ - HTTPS
- 起動時の実行
- 再起動
- レプリケーション(実行中のプロセス数)
- メモリ
- 起動前の事前準備
これらの各コンセプトについて、それらの考え方、そしてそれらを扱うための戦略の具体的な例を、次の章で詳しく説明します。🚀