アプリケーション開発ポータルサイト
ServerNote.NET
カテゴリー【PythonApache
ファイアウォール内部のOpenAPI/FastAPIのdocsを外部からProxyPassで呼ぶ
POSTED BY
2025-02-18

セキュリティの観点から、外部から直接HTTPサーバのルートにアクセスさせず、1つディレクトリ名を介してアクセスさせることがままある。

マシン内部では
http://172.16.33.55:51115/
のようなAPIサーバが立ち上がっているとして、それがOpenAPIに準拠していれば、APIドキュメントは
http://172.16.33.55:51115/docs
となるはずである。

マシン内部や社内ローカルからであれば上記URLに直接アクセスしてしまえばいいが、外部に一般公開したい場合、
https://aaa.myserver333.jp/my_api/docs
のように、my_apiなどの名前を1つ置いてアクセスさせたい。
このような場合、まずリダイレクト設定として以下Apacheの基本設定をする。

<location>
    Require all granted
    ProxyPass 172.16.33.55:51115
    ProxyPassReverse 172.16.33.55:51115
    RequestHeader set X_FORWARDED_PROTO 'https'
</location>

これで
https://aaa.myserver333.jp/my_api/docs
へのアクセスは
http://172.16.33.55:51115/docs
へリダイレクトされるのだが、これだけではOpenAPIのopenapi.json他付随ファイルパスがすべて/openapi.jsonのままであり、404 Not Foundとなる。
これを解決するためには、API実行側でFastAPIオブジェクトを生成するときに、以下のようにroot_path引数を与えてやればよい。

app = FastAPI(
    title="MY API ENGINE",
    description="オリジナルエンジンです。",
    version=__version__,
    root_path="/my_api",
    openapi_url="/openapi.json",  # 相対パスにする
    docs_url="/docs",
    redoc_url="/redoc",
    )

こうすることにより、/openapi.jsonが/my_api/openapi.jsonと呼ばれるので、上記ApacheのProxyにかかってちゃんと
http://172.16.33.55:51115/openapi.json
が取得できる。

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

【キーワード検索】