1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

さくらのレンタルサーバーでFastAPI

Posted at

はじめに

さくらのレンタルサーバーで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関連ファイル

.htaccessindex.cgiでFastAPIアプリを動作できるように設定。パーミッションやRewriteRuleのパスやshbangのパスなどは参考文書を見て適宜設定・読み換え。

.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /api/v2/index.cgi/$1 [QSA,L]
<Files ~ "\.py$">
  deny from all
</Files>
index.cgi
#!/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をそのまま利用し、

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)も動作する様です。

スクリーンショット 2024-03-02 12.12.39.png

まとめ

  • 各種環境が古いので運用には問題があるかも
  • Hello worldでの動作確認なので実際にはどうなるか不明
  • OpenSSLやRustをセルフビルドし最新環境にできるかに関しては未検証
  • さくらやFreeBSDのアップデート次第では状況が変わってくる
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?