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
上記の記述は、デフォルトでコメントアウトされているという情報もありましたが、私が見たところコメントでも存在していませんでした。
- mod_proxy
- 基本的なプロキシ機能を提供します。リバースプロキシ設定の基礎となります。
- mod_proxy_http
- HTTPを通じてのプロキシリクエストを扱います。通常のHTTP通信をリバースプロキシする場合に必要です。
- 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 アプリケーションが正しく表示されるかを確認します。
以上です。