(ちょっとニッチな)FastAPI環境構築の巻(その2)

Date:

Share post:

前回の記事で 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の基本的な環境を作成することができたので、これを足がかりにぼちぼち進めてみたいと思います。

Related articles

画像検索の精度確認(4)

前回の投稿では、エンベディングの前処...

画像検索の精度確認(3)

過去の投稿を通して、TensorFl...

(ちょっとニッチな)FastAPI環境構築の巻(そ...

最近Tさんがすごい勢いで記事を書かれて...

画像検索の精度確認(2)

先の投稿で、類似度の高い画像の識別に...