Xserver で FastAPI を利用するときの .htaccess の設定

FastAPIはPythonベースの軽量なWebフレームワークであり、APIサーバーの構築に非常に便利です。しかし、Xserverのような共有ホスティング環境では、通常の方法でFastAPIを動作させるのにいくつかの制約があります。

このノートでは、FastAPIをXserverで利用する際の設定方法をまとめます。

前提条件

  • Uvicorn: FastAPIアプリケーションを動作させるためのASGIサーバーとして、Uvicornがインストールされている必要があります。
  • Xserver: 共有ホスティング環境ですが、リバースプロキシやApacheの .htaccess ファイルを用いた設定が可能です。

FastAPIアプリケーションの基本構成

まず、FastAPIの基本的なアプリケーションの例を示します。

# main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/hello")
def read_root():
    return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

このアプリケーションを uvicorn で起動し、バックグラウンドで動作させます。

$ nohup uvicorn main:app --reload &

これで、localhost:8000 で FastAPI アプリケーションが動作します。

Xserver での .htaccess 設定

Xserverの共有ホスティング環境では、Pythonアプリケーションを直接ホスティングすることは難しいため、.htaccess を使用してApacheのリバースプロキシを設定する必要があります。

.htaccess ファイルの設定

~/yamnor.xsrv.jp/public_html/.htaccess に以下のコードを追加します。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ http://localhost:8000/$1 [P,L]
</IfModule>

この設定によって、外部からのリクエストを localhost:8000 で動作している FastAPI アプリケーションに転送します。

注意点

いくつかの注意点があります。

  1. Apacheモジュールの確認:

    • mod_proxy および mod_rewrite が有効になっていることを確認します。これらのモジュールが無効な場合、リバースプロキシ設定が機能しないため、Xserverのサポートに確認する必要があります。
  2. ポート制限:

    • 共有ホスティング環境では、ローカルホストのポートに制限がある場合があります。localhost:8000 にプロキシできるかどうかは、ホスティングサービスの仕様によります。
  3. セキュリティ:

    • リバースプロキシを使う場合、セキュリティ上のリスクも考慮する必要があります。認証の追加やIPアドレス制限、SSLの導入を検討すると良いでしょう。

問題が発生した場合

もしFastAPIアプリケーションが正しく動作しない場合は、以下の点を検討します。

  • VPSの使用: 共有ホスティングでFastAPIを動作させるのが困難な場合、仮想プライベートサーバー(VPS)などのサービスでFastAPIをホスティングする方法があります。VPSでは、より自由にポート設定やサーバー構成を制御できるため、UvicornやNginxの設定が柔軟に行えます。

  • リバースプロキシの確認: ApacheやNginxを使ったリバースプロキシ設定でFastAPIにリクエストを転送する方法も有効です。

<VirtualHost *:80>
    ServerName yamnor.xsrv.jp

    ProxyPass / http://localhost:8000/
    ProxyPassReverse / http://localhost:8000/
</VirtualHost>

まとめ

Xserverのような共有ホスティング環境でFastAPIを動作させるには、リバースプロキシ設定やApacheのモジュールを活用する必要があります。共有ホスティング環境の制限により、うまく動作しないケースもありますので、その場合はVPSなど他のホスティング方法を検討します。

Posted :