作業目的
Apacheを介して、FastAPIにアクセスする。
環境
RedHat EnterpriseLinux 8.7
Python 3.8
※RHEL8.7のデフォルトのPythonは3.6だが、WebSocketの検証も行う予定のため、3.8を使用する。。
FastAPI環境構築
# pip3.8 install "fastapi[all]"
以下の方法ではインストールは行えたが、サンプルとの疎通試験で、telnet localhost 8000
で無応答であった。プロンプトの応答もなし。
pip3.8 install fastapi uvicorn
2023/02/24追記
別マシンでcurl http://localhost:8000
で確認したところ、疎通確認はできた。
telnetでもリクエストヘッダを適切に指定すれば疎通確認ができるとは思うが、curlでよいと思う。
FastAPIの設定
サンプルプログラム
$ mkdir /www/api/fastapi_server
$ cd /www/api/fastapi_server
$ vi main.py
サンプルプログラムは以下のmain.pyを使用。シェバンは不要。
https://fastapi.tiangolo.com/ja/tutorial/first-steps/
サービス起動
ポートはデフォルトの8000を使用する。
$ uvicorn main:app --reload
FastAPI単体での動作確認
ポートを開放して、アクセスできるホストの制限を外す。
# su
# firewall-cmd --add-port=8000/tcp
# exit
$ uvicorn main:app --reload --host 0.0.0.0 --port 8000
デフォルトでは127.0.0.1
からののみ受け付ける。--host 0.0.0.0
でIPアドレスの制限が無くなる。
サブネットマスクで制限できる方法は別途調べる。
ポートを変更する場合は--port
オプションで変更できる。
別ターミナルからの確認
$ curl http://localhost:8000
レスポンスが返ってくることを確認
telnet localhost 8000
ではBad Requestになる。RequestHeaderを設定すれば動作するかもしれないが、curlで十分
別PC(Win10)のブラウザから確認
ブラウザで以下のURLにアクセスする
http://IPアドレス:8000/
確認終了後
開放していたポート8000を閉じる。
# firewall-cmd --remove-port=8000/tcp
Apacheを介して接続できるようにする。
/apiはFastAPIにアクセスできるようにする。
-#LoadModule proxy_module modules/mod_proxy.so
-#LoadModule proxy_http_module modules/mod_proxy_http.so
-#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
+LoadModule proxy_module modules/mod_proxy.so
+LoadModule proxy_http_module modules/mod_proxy_http.so
+LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
proxy_wstunnel_moduleを有効にしているのは、WebSocketの試験を行うため。
WebSocketを使用しないならば、proxy_wstunnel_moduleはコメントアウトのままでよい。
SSLProxyEngine on
<Location /api/>
ProxyPass http://localhost:8000/
ProxyPassReverse http://localhost:8000/
</Location>
systemdでFastAPIの自動起動設定
[Unit]
Description=The uvicorn process
Before=httpd.service
After=network.target remote-fs.target nss-lookup.target
[Service]
User=www
Group=www
WorkingDirectory=/www/api/fastapi_server
ExecStart=/usr/local/bin/uvicorn main:app --reload
ExecReload = /bin/kill -s HUP $MAINPID
ExecStop = /bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
# systemctl daemon-reload
# systemctl restart uvicorn
# systemctl enable uvicorn
動作確認
ブラウザでhttps://IPアドレス/api/
を表示して、レスポンスが表示されることを確認する。
ToDo
api/docs ではswaggerのドキュメントが参照できないので調査する。
参考