【问题标题】:Heroku sock=backend Server Request Interrupted for a Flask SocketIO applicationHeroku sock=Flask SocketIO 应用程序的后端服务器请求中断
【发布时间】:2025-12-22 11:00:11
【问题描述】:

我在 heroku 上托管了一个 flask-socketio 应用程序,带有以下 Procfile:

web: gunicorn --worker-class eventlet hello:app

自从我切换到 socketio 后,该应用程序的行为一直不一致。早些时候,应用会运行一段时间,然后 POST 请求会开始超时。

从昨天晚上开始,我一直收到错误

sock=backend at=error code=H18 desc="Server Request Interrupted" method=GET path="/static/js/third-party/browser.js" host=deard.herokuapp.com request_id=725da6af-aa29-4293-a411-2c89977f1d4d fwd="216.165.95.0" dyno=web.1 connect=1ms service=36ms status=503 bytes=13811

我阅读了 Heroku 错误代码描述,上面写着“后端套接字,属于您的应用程序的 Web 进程,在后端返回 HTTP 响应之前已关闭。”

但我不知道为什么会发生这种情况。

任何关于我应该注意什么的线索,都将帮助我进行调试。

我可以分享代码,但它有 300 行长,而且由于我不知道错误的来源,我不确定它是否会有所帮助。

【问题讨论】:

  • 您在本地运行应用程序时是否遇到同样的问题(或任何其他问题)? (与独角兽)
  • 不,它在本地使用 gunicorn 运行良好。
  • 您可以尝试将 procfile 工人类标签更改为:--worker-class socketio.sgunicorn.GeventSocketIOWorker。我正在关注这个here
  • 我在使用 eventlet 之前已经阅读了您的博客,因此可以避免更改为 gevent。我尝试安装 gevent 并更改 Procfile 并且 gunicorn 无法运行。仍在弄清楚哪里出了问题。
  • @wgwz 不,您的建议不适用于此。使用 gevent-socketio 时会使用 GeventSocketIOWorker 类。但是 Flask-SocketIO 不使用那个包。

标签: python heroku flask flask-socketio


【解决方案1】:

当您在服务器端(flask)取消或重新发送相同的请求时,Flask 会引发这种“套接字流错误”,而您仍在计算中以呈现与初始请求相对应的布局。

所以它可能与双方(服务器/客户端)的超时或网络错误处理有关。

一些问题:

请求计算在服务器端需要多长时间? 您如何处理服务器端和客户端的网络错误异常? 烧瓶或客户端是否存在超时?

也有可能在前一个请求结束之前发送了一个新请求..

请分享一些与请求处理相关的代码。

【讨论】:

    【解决方案2】:

    这对我有用:

    from waitress import serve
    # app.run(host='0.0.0.0', port=port) # <---- REMOVE THIS
    # serve your flask app with waitress, instead of running it directly.
    serve(app, host='0.0.0.0', port=port) # <---- ADD THIS
    
    

    【讨论】: