前回の記事で FastAPI のインストールまでが完了した状態ですので、動作確認をしてみたいと思います。まずFastAPIがインストールされていることを確認します。pythonのインタラクティブシェルを使用すると確認ができます。
(venv) pgvector-test@host:~/apps/fastapi$ python3 ← venvが有効化されている
Python 3.10.12 (main, Jan 17 2025, 14:35:34) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from fastapi import FastAPI
>>> ← インストールされているのでエラーが出ない
インストールができているので、次に以下のようなソースを用意します。
main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
ルートURLにGETリクエストが行われた場合に、JSON形式のレスポンスで “Hello World” を返却するというシンプルなソースです。ソースを以下ディレクトリに配置します。
home/pgvector-test/apps/fastapi/app
では、uvicorn コマンドを実行します。
(venv) pgvector-test@host:~/apps/fastapi/app$ uvicorn main:app --reload
INFO: Will watch for changes in these directories: ['/home/pgvector-test/apps/fastapi/app']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [11338] using WatchFiles
INFO: Started server process [11341]
INFO: Waiting for application startup.
INFO: Application startup complete.
ASGIサーバが起動することが確認できました。
^CINFO: Shutting down
INFO: Waiting for application shutdown.
INFO: Application shutdown complete.
INFO: Finished server process [11341]
INFO: Stopping reloader process [11338]
Ctrl + C(Macです。)でサーバがシャットダウンします。
ただ、上の方にも記述がある通り、ASGIサーバは 127.0.0.1:8000 でLISTENしています。今回は Webmin / Virtualmin 環境上ですので、そのままではブラウザ上に表示されることはありません。どうしたらいいものかと調べていたところ、Apache(Webサーバ)をリバースプロキシとして使用することでASGIサーバ側にポート転送をかけることができるようです。やってみます。
Apacheのconf(/etc/apache2/sites-available/pgvector-test.com.conf)に以下の記述を追加してみます。
<VirtualHost XXX.XXX.XXX.XXX:80 [xxxx::xx:xxxx:xxxx:xxxx]:80>
・
・
・
# FastAPIアプリケーションへのリバースプロキシ設定
ProxyPreserveHost On
ProxyPass /api http://127.0.0.1:8000/
ProxyPassReverse /api http://127.0.0.1:8000/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost XXX.XXX.XXX.XXX:443 [xxxx::xx:xxxx:xxxx:xxxx]:443>
・
・
・
# FastAPIアプリケーションへのリバースプロキシ設定
ProxyPreserveHost On
ProxyPass /api http://127.0.0.1:8000/
ProxyPassReverse /api http://127.0.0.1:8000/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Apacheが受け取った/api
で始まるリクエストを、ローカルホストのポート8000で動作しているFastAPIアプリケーションに転送するように設定を行なっています。設定後にApacheを再起動します。
# systemctl restart apache2
再度ASGIサーバを起動してみます。
(venv) pgvector-test@host:~/apps/fastapi/app$ uvicorn main:app --reload
INFO: Will watch for changes in these directories: ['/home/pgvector-test/apps/fastapi/app']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [15745] using WatchFiles
INFO: Started server process [15747]
INFO: Waiting for application startup.
INFO: Application startup complete.
ブラウザにアクセスしてみます。
https://pgvector-test.com/api (/etc/hostsに設定済み)

jsonの応答が表示されましたね!
ただ、これだとサーバが再起動した場合、ASGIサーバを手動で再起動する必要があります。ですのでシステムサービスに登録してみます。
システムサービスの構成ファイルは以下のディレクトリにあります。
/etc/systemd/system
今回は、FastAPIのASGIサーバを起動するサービスとして fastapi.service を作成しました。設定内容は以下の通りです。
[Unit]
Description=FastAPI application
After=network.target
[Service]
User=pgvector-test ← 仮想ホスト作成時のユーザーを設定
Group=pgvector-test ← 仮想ホスト作成時のグループを設定
WorkingDirectory=/home/pgvector-test/apps/fastapi/app ← 作業ディレクトリの指定
ExecStart=/home/pgvector-test/apps/fastapi/venv/bin/uvicorn main:app --host 0.0.0.0 --port 8000
Restart=always ← uvicornコマンドの実行
[Install]
WantedBy=multi-user.target
この時の記述で注意する点としては、実行ユーザーが使用するuvicornの場所を正しく指定するということでしょうか。
上記内容でシステムサービスとして登録し、以下を実行します。
# systemctl daemon-reload ← systemd に反映する
# systemctl start fastapi ← fastapi.service を起動する
# systemctl enable fastapi ← fastapi.service の自動起動を有効にする
Created symlink /etc/systemd/system/multi-user.target.wants/fastapi.service → /etc/systemd/system/fastapi.service.
# systemctl status fastapi ← サービスの状態を確認
● fastapi.service - FastAPI application
Loaded: loaded (/etc/systemd/system/fastapi.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2025-02-10 12:22:58 JST; 11min ago
Main PID: 1279 (uvicorn)
Tasks: 6 (limit: 4646)
Memory: 40.0M
CPU: 2.711s
CGroup: /system.slice/fastapi.service
└─1279 /home/pgvector-test/apps/fastapi/venv/bin/python3 /home/pgvector-test/apps/fastapi/venv/bin/uvicorn main:app --host 0.0>
Feb 10 12:22:58 host.pgvector-test.com systemd[1]: Started FastAPI application.
Feb 10 12:23:02 host.pgvector-test.com uvicorn[1279]: INFO: Started server process [1279]
Feb 10 12:23:02 host.pgvector-test.com uvicorn[1279]: INFO: Waiting for application startup.
Feb 10 12:23:02 host.pgvector-test.com uvicorn[1279]: INFO: Application startup complete.
Feb 10 12:23:02 host.pgvector-test.com uvicorn[1279]: INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
一応起動が確認できた状態で、再度ブラウザ表示を確認してみます。
https://pgvector-test.com/

https://pgvector-test.com/api

それぞれ表示、動作していることが確認できました!
APIの基本的な環境を作成することができたので、これを足がかりにぼちぼち進めてみたいと思います。