Apache2反向代理Streamlit应用至子目录失败求助
Apache反向代理配置错误导致Streamlit子目录访问静态资源404的解决方法
问题诊断
你的配置存在四个核心问题:
- HTTP/HTTPS跳转规则完全写反:原有规则会把HTTPS请求强制跳转到HTTP,直接导致加密连接失效
- Streamlit未配置基础路径:Streamlit默认从根路径加载静态资源,不知道自己运行在
/llm子目录下,因此会生成/static/...的资源路径,而非/llm/static/... - ProxyPassReverse配置错误:当前配置会把响应头里的路径重写为根目录,而非
/llm子目录 - Rewrite规则与ProxyPass冲突:重复的转发规则会导致请求处理逻辑混乱
修复步骤
1. 修改Streamlit启动命令
启动Streamlit时必须指定基础路径,让它知道自己在子目录下运行:
streamlit run your_app.py --server.baseUrlPath=/llm
2. 替换完整的Apache配置
将/etc/apache2/sites-available/your-site.conf的内容替换为以下配置:
# 启用SSL及证书配置 ServerName example.com SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf # HTTP强制跳转至HTTPS(修正原有反向跳转错误) RewriteEngine On RewriteCond %{ENV:HTTPS} !=on RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R=301,L] # 密码保护(直接保护/llm子目录) <Location /llm> AuthType Basic AuthName "Restricted Content" AuthUserFile /etc/apache2/.htpasswd Require valid-user </Location> # 反向代理配置:处理WebSocket和普通HTTP请求 ProxyRequests Off ProxyPreserveHost On # WebSocket转发规则 RewriteCond %{HTTP:Upgrade} =websocket RewriteRule /llm/(.*) ws://localhost:8501/llm/$1 [P,L] # 普通HTTP请求转发规则 RewriteCond %{HTTP:Upgrade} !=websocket RewriteRule /llm/(.*) http://localhost:8501/llm/$1 [P,L] # 主代理规则,确保路径映射完全匹配 <Location /llm> ProxyPass http://localhost:8501/llm ProxyPassReverse http://localhost:8501/llm </Location>
3. 重启服务生效
systemctl restart apache2 # 重启你的Streamlit应用(务必使用新的启动命令)
关键修改说明
- 修正HTTPS跳转逻辑:把原有反向跳转改成HTTP强制转HTTPS,确保所有请求都走加密连接
- Streamlit基础路径配置:
--server.baseUrlPath=/llm让Streamlit生成所有资源路径时自动加上/llm前缀,从根源避免静态资源404 - ProxyPassReverse修正:改为匹配
http://localhost:8501/llm,Apache会把Streamlit响应头里的路径正确重写为/llm/... - 合并转发规则:统一WebSocket和普通请求的转发逻辑,避免规则冲突
- 密码保护调整:用
<Location /llm>替代<Directory>,直接保护子目录路径,更适配反向代理场景
内容的提问来源于stack exchange,提问作者Olivier K
相关产品推荐
相关产品推荐

