Skip to content

Apache の特定ディレクトリアクセスがあった際、デーモン化した Streamlit で応答する

以前に以下のメモを書きました。

今回は Nginx では無く、Apache 2.4 で特定ディレクトリへアクセスがあった場合のみリバースプロキシ動作をさせ、デーモン化した Streamlit アプリケーションで応答する設定例をメモしておきます。 尚、miseuv は事前にインストールされている前提とします。

検証環境

対象 バージョン
Ubuntu 24.04.2 LTS
Apache 2.4.58
Python 3.13.3
Streamlit 1.45.1

Streamlit アプリケーションのデーモン化

Streamlit アプリケーションを用意し、デーモン化していきます。 まず、アプリケーションを配置するディレクトリを用意します。 今回は /opt/streamlit にしました。

mkdir -p /opt/streamlit/.streamlit && \
cd /opt/streamlit

uv で Python の仮想環境を作成したら Streamlit をインストールします。

uv venv .venv && \
uv pip install streamlit

mise の設定ファイルに利用する Python バージョンを指定し、更に Python の仮想環境 (今回は .venv) を利用するように設定します。

/opt/streamlit/mise.toml
[tools]
python = "latest"

[env]
_.python.venv = ".venv"

Streamlit アプリケーションの動作は .streamlit/config.toml で定義されます。 今回は以下の内容としました。

/opt/streamlit/.streamlit/config.toml
[browser]
gatherUsageStats=false

[server]
enableWebsocketCompression=false
headless=true
runOnSave=true 

[theme]
base="light"

Streamlit アプリケーションを用意します。 Hello, World! という文字列を表示するだけのアプリケーションです。

/opt/streamlit/app.py
import streamlit as st


def main():
    css = """
      <style>
      #MainMenu {visibility: hidden;}
      </style>
      """
    st.markdown(css, unsafe_allow_html=True)
    st.write("Hello, World!")


if __name__ == "__main__":
    main()

これで Streamlit アプリケーションの用意は完了です。 デーモン化する為に以下の内容で Systemd 用のユニットファイルを用意します。

/etc/systemd/system/streamlit_app.service
[Unit]
Description=Streamlit Application
After=network.target

[Service]
Type=simple
WorkingDirectory=/opt/streamlit/
ExecStart=/opt/streamlit/.venv/bin/streamlit run /opt/streamlit/app.py --server.address 127.0.0.1 --server.port 8501
Restart = on-failure

[Install]
WantedBy=multi-user.target

デーモンを開始します。

systemctl daemon-reload && \
systemctl enable streamlit_app.service && \
systemctl start streamlit_app.service

Apache のインストール

Apache をインストールします。

apt install -y apache2

必要なモジュールを有効化します。

a2enmod proxy proxy_http proxy_wstunnel

Apache の設定ファイルに「http://ADDRESS/streamlit/ ディレクトリへアクセスされた場合、ローカルホストの TCP/8501 へ転送する」設定をします。

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    ProxyPreserveHost On
    ProxyPass /streamlit/ http://localhost:8501/
    ProxyPassReverse /streamlit/ http://localhost:8501/
    <Location /streamlit/>
        ProxyPass ws://localhost:8501/
        ProxyPassReverse ws://localhost:8501/
        Require all granted
    </Location>
</VirtualHost>

アクセス確認する

Web ブラウザで http://ADDRESS/streamlit/ へアクセスし、Hello, World! と表示されれば OK です。

image

参考

デフォルトの /etc/apache2/sites-enabled/000-default.conf

/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>