スポンサーリンク

EC2×Streamlit×Apacheのリバースプロキシ設定

記事内に広告が含まれています。

AWSのEC2にApacheをインストールしてリバースプロキシとして動作させた上で、Streamlitアプリを稼働させる方法を記載します。

主にApacheのインストール、設定のメモですので、EC2の設定やStreamlitのデプロイについては省きます。

動作確認は、Amazon Linux 2023、Apache 2.4で行っております。

スポンサーリンク

Apacheインストール

EC2にSSHで接続し、以下のコマンドを実行します。

sudo yum update -y
sudo yum install -y httpd
sudo systemctl start httpd.service
sudo systemctl enable httpd.service

ブラウザで EC2 インスタンスのパブリック DNS 名または IP アドレスを入力して、Apache のデフォルトページが表示されることを確認します。

スポンサーリンク

Apache設定

設定ファイル編集

Apache のメイン設定ファイル httpd.conf または適切なサブ設定ファイルを編集します。

sudo vi /etc/httpd/conf/httpd.conf

設定ファイルに以下の行を追加し、モジュールをロードするようにします。

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

上記の記述は、デフォルトでコメントアウトされているという情報もありましたが、私が見たところコメントでも存在していませんでした。

  1. mod_proxy
    • 基本的なプロキシ機能を提供します。リバースプロキシ設定の基礎となります。
  2. mod_proxy_http
    • HTTPを通じてのプロキシリクエストを扱います。通常のHTTP通信をリバースプロキシする場合に必要です。
  3. mod_proxy_wstunnel
    • WebSocketプロトコルのプロキシをサポートします。StreamlitがWebSocketを使用してクライアントとサーバー間の対話的な通信を行う場合、このモジュールが必要になります。

続いて、/etc/httpd/conf.d/streamlit.conf を以下の内容で作成します。

<VirtualHost *:80>
    ProxyPreserveHost On

    ProxyPass "/_stcore/stream" "ws://localhost:8501/_stcore/stream"
    ProxyPassReverse "/_stcore/stream" "ws://localhost:8501/_stcore/stream"

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

この設定は、Apacheを使用してStreamlitアプリケーションのリバースプロキシを行うためのものです。ここがわからずハマりました。

リバースプロキシ設定について

VirtualHostディレクティブ

<VirtualHost *:80>

ポート80でのすべてのIPアドレスに対するリクエストをこのVirtualHostブロックで処理することを指定します。ポート80はHTTPの標準ポートです。

ProxyPreserveHostディレクティブ

ProxyPreserveHost On

リクエストヘッダーのHostフィールドをプロキシサーバーが受け取ったそのままの値でバックエンドサーバー(この場合はStreamlitが稼働しているサーバー)に渡すようApacheに指示します。

これにより、バックエンドサーバーがHost情報を元に適切に応答を生成できるようになります。

WebSocketのプロキシ設定

ProxyPass "/_stcore/stream" "ws://localhost:8501/_stcore/stream"
ProxyPassReverse "/_stcore/stream" "ws://localhost:8501/_stcore/stream"

これらの行は、クライアントからのWebSocketリクエスト(/_stcore/streamに対するもの)をlocalhostの8501ポートの同じパスに転送するための設定です。

ProxyPassは、リクエストを転送するためのもので、ProxyPassReverseは、サーバーからの応答をクライアントに返す際のURLを元の形式に書き戻すために使用します。リアルタイムのデータ通信を扱うStreamlitの機能をサポートするために重要です。

通常のHTTPリクエストのプロキシ設定

ProxyPass / http://localhost:8501/ ProxyPassReverse / http://localhost:8501/

これらの行は、その他のすべてのHTTPリクエストをlocalhostの8501ポートに転送するための設定です。WebSocket以外の通常のHTTPリクエスト(ページのロード、API呼び出し等)がこのルールに従います。同様に、ProxyPassはリクエストを転送し、ProxyPassReverseは応答のURLを適切にクライアントに返すために使用されます。

ApacheおよびStreamlit起動

Apacheを再起動します。

sudo systemctl restart httpd.service

Streamlitを起動します。

nohup streamlit run ~/streamlit_app.py --server.port 8501 &

ブラウザから http://<host-ip>/ にアクセスして、Streamlit アプリケーションが正しく表示されるかを確認します。

以上です。

タイトルとURLをコピーしました