通过Nginx在DigitalOcean Droplet部署Streamlit Docker镜像遇加载异常
排查方向:Streamlit + Nginx反向代理卡在"Please wait..."
1. 修复WebSocket相关的Nginx配置
Streamlit依赖WebSocket实现实时交互,你的配置中注释掉了proxy_http_version 1.1;,这会导致WebSocket握手失败,是加载卡住的核心原因之一。
修改Nginx配置,取消该行注释:
# file located /etc/nginx/sites-available/default server { listen 80 default_server; listen [::]:80 default_server; index index.html index.htm index.nginx-debian.html; server_name _; location / { proxy_pass http://localhost:8501; proxy_http_version 1.1; # 必须启用这行 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
修改后执行sudo systemctl restart nginx生效。
2. 验证容器与主机的网络连通性
在Droplet主机上执行:
curl http://localhost:8501
如果无法返回Streamlit的HTML页面,说明:
- 容器内的Streamlit未监听
0.0.0.0:启动命令需改为streamlit run --server.address 0.0.0.0 app.py(容器内仅监听localhost的话,主机无法访问) - 端口映射失败:检查容器启动命令的
-p 8501:8501是否正确,用docker ps确认容器端口状态
3. 查看日志定位异常
- Nginx错误日志:查看是否有连接或WebSocket相关错误
tail -f /var/log/nginx/error.log - Streamlit容器日志:检查是否有数据库连接失败、请求处理异常
docker logs <你的容器ID>
4. 检查防火墙规则
- Droplet本地防火墙:确保80端口开放
sudo ufw allow 80 sudo ufw reload - DigitalOcean云防火墙:确认已添加入站规则允许80端口的TCP流量
5. 增加Nginx代理超时设置
Streamlit加载页面可能需要较长时间,默认超时设置可能导致连接中断,在location块中添加超时配置:
proxy_connect_timeout 60s; proxy_send_timeout 60s; proxy_read_timeout 60s;
6. 确认Streamlit启动参数
容器内启动Streamlit时,需确保:
- 监听地址为
0.0.0.0:--server.address 0.0.0.0 - 必要时关闭CORS/XSRF保护(如果存在跨域问题):
--server.enableCORS false --server.enableXsrfProtection false
内容的提问来源于stack exchange,提问作者Randall Thomas
相关产品推荐
相关产品推荐

