はじめに
さくらのレンタルサーバーでFlaskを動かす記事を見たので、同様の方法でFastAPIが動かせるかを試してみた。
とりあえず動く様だが…
- 各種環境が古いので運用には問題があるかも
- また、Hello worldでの動作確認なので実際にはどうなるか不明
さくらの制限
これを書いている現在の自分のレンタルサーバー環境だと
- FreeBSD 11.2-RELEASE-p15
- OpenSSL 1.0.2o-freebsd 27 Mar 2018
となっていた。
これにより、
Pythonを最新のものにできない
さくらのレンタルサーバーのFreeBSDのOpenSSLが古いのでPython 3.9までになる。Python 3.10以降はOpenSSL1.1.1以降が必須。
Pydanticを最新のものにできない
FastAPIが利用しているPydanticはV2からRustで実装されているとのことだが、さくらのレンタルサーバにはRustをインストールすることができずPydantic V1を使い続ける必要がある。本当にさくら環境でRustが動かせないかは不明だがとりあえず諦めた。
参考になる文書を読む
まず、次の記事を参考にFlaskの場合を試してみる
自分の場合、サーバー上のパスは ~/www/api/v1/*
、WebAPIのパスとして/api/v1/*
に読み換えてFlaskの動作確認をしてみた。
これは~/www/*
,/*
にフロントエンドを置くこと、FastAPIをv2パスに置くことを想定。
pyenv+virtualenv環境
上記の参考文書を見てpyenv+virtualenvの環境を用意する。pyenv+virtualenvの使い方に関しては省略。
Python
最初に書いたようにOpenSSLのバージョンが古いのでPython 3.10以上はインストールできないので3.9.xまでで指定する。
FastAPI
Pydantic V1が使われるようにFastAPIをインストールする。これを書いている現在FastAPI 0.110.0との組み合わせでインストールできたがPydantic V1がいつまでサポートされるかは不明。
pip install fastapi 'pydantic<2'
FastAPIはASGIなのでWSGIにコンバートするためにa2wsgiをインストール。
pip install a2wsgi
環境まとめ
これを書いている時点でのバージョンは次の様になった。さくらやFreeBSDのアップデートで状況が変わってくると良いですが…
- FreeBSD 11.2-RELEASE-p15
- OpenSSL 1.0.2o-freebsd 27 Mar 2018
- Python 3.9.18
- fastapi 0.110.0
- pydantic 1.10.14
実際のアプリケーション
CGI関連ファイル
.htaccess
とindex.cgi
でFastAPIアプリを動作できるように設定。パーミッションやRewriteRuleのパスやshbangのパスなどは参考文書を見て適宜設定・読み換え。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /api/v2/index.cgi/$1 [QSA,L]
<Files ~ "\.py$">
deny from all
</Files>
#!/home/username/.pyenv/versions/3.9.18-fastapi/bin/python
import a2wsgi
from wsgiref.handlers import CGIHandler
from main import app
wsgi_app = a2wsgi.ASGIMiddleware(app)
CGIHandler().run(wsgi_app)
FastAPIアプリケーション
公式ページのサンプルのmain.py
をそのまま利用し、
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
動作
上記で用意した2個のAPIも動作し、OpenAPI/Swaggerのページ(/docs
)やReDoc(/redoc
)も動作する様です。
まとめ
- 各種環境が古いので運用には問題があるかも
- Hello worldでの動作確認なので実際にはどうなるか不明
- OpenSSLやRustをセルフビルドし最新環境にできるかに関しては未検証
- さくらやFreeBSDのアップデート次第では状況が変わってくる