App is not loading when running remotely

以下是用户在远程托管Streamlit应用程序时,自己搭建解决方案时常见的几个错误。

要了解一种看似简单的方法来托管Streamlit应用程序,避免以下所有问题,请查看Streamlit Community Cloud

当你在浏览器中输入应用程序的URL时,如果只看到空白页面、“页面未找到”错误、“连接被拒绝”错误或类似情况,首先检查Streamlit是否确实在远程服务器上运行。在Linux服务器上,你可以通过SSH登录,然后运行:

ps -Al | grep streamlit

如果你看到 Streamlit 正在运行,最可能的原因是 Streamlit 端口未暴露。解决方法取决于你的具体设置。以下是三个示例解决方法:

  • 尝试端口80: 一些主机默认暴露端口80。要将Streamlit设置为使用该端口,请使用--server.port选项启动Streamlit:

    streamlit run my_app.py --server.port=80
  • AWS EC2 服务器: 首先,在AWS 控制台中点击您的实例。 然后向下滚动并点击安全组入站编辑。接下来,添加 一个自定义 TCP规则,允许端口范围 8501来源0.0.0.0/0

  • 其他类型的服务器: 检查防火墙设置。

如果这仍然不能解决问题,尝试运行一个简单的HTTP服务器而不是Streamlit,看看是否能正常工作。如果可以,那么你知道问题出在你的Streamlit应用程序或配置中(在这种情况下,你应该在我们的论坛上寻求帮助!)如果不可以,那么它肯定与Streamlit无关。

如何启动一个简单的HTTP服务器:

python -m http.server [port]

从版本1.29.0开始,此症状的表现有所不同。对于较早版本的Streamlit,加载应用程序会在页面中央显示一个带有“请稍候...”消息的蓝色框。从版本1.29.0开始,加载应用程序会显示骨架元素。如果此加载屏幕没有消失,根本原因可能是以下之一:

  • 使用端口3000,该端口保留用于内部开发。
  • 配置错误的CORS保护。
  • 服务器正在从Websocket连接中剥离头部信息,从而破坏了压缩功能。

要诊断问题,首先确保你没有使用端口3000。如果有疑问,请尝试如上所述的端口80。

接下来,尝试通过运行Streamlit并设置--server.enableCORS标志为false来暂时禁用CORS保护:

streamlit run my_app.py --server.enableCORS=false

如果这解决了你的问题,你应该重新启用CORS保护,然后将 browser.serverAddress 设置为你的Streamlit应用的URL。

如果问题仍然存在,尝试通过运行Streamlit时设置--server.enableWebsocketCompression标志为false来禁用Websocket压缩。

streamlit run my_app.py --server.enableWebsocketCompression=false

如果这解决了你的问题,你的服务器设置可能正在剥离用于协商Websocket压缩的Sec-WebSocket-Extensions HTTP头。

Streamlit 不需要压缩即可工作,但强烈建议使用压缩,因为它可以提高性能。如果您想重新启用它,您需要找到基础设施中剥离 Sec-WebSocket-Extensions HTTP 头的部分,并更改该行为。

如果文件上传小部件返回状态码为403的错误,这可能是由于您的应用程序中的XSRF保护逻辑配置错误所致。

要诊断问题,请尝试通过运行Streamlit并设置--server.enableXsrfProtection标志为false来暂时禁用XSRF保护:

streamlit run my_app.py --server.enableXsrfProtection=false

如果这解决了你的问题,你应该重新启用XSRF保护并尝试以下一种或两种方法:

  • browser.serverAddressbrowser.serverPort 设置为你的 Streamlit 应用程序的 URL 和端口。
  • 通过将server.cookieSecret配置选项设置为相同的难以猜测的字符串,配置您的应用程序在每个副本中使用相同的密钥。
forum

还有问题吗?

我们的 论坛 充满了有用的信息和Streamlit专家。