我该怎么解释Heroku H18错误?

时间:2012-10-03 08:41:08

标签: heroku

我们在日志中看到了很多错误H18(请求中断)。如何解释这些,因为在所有情况下sock = client我假设它是断开连接的客户端。因此,忽视这些是否安全?

5 个答案:

答案 0 :(得分:54)

这通常表示用户的网络已断开连接(例如,这种情况发生在移动用户的某些频率上),或者最终用户关闭了他们的浏览器或类似网站(例如,按下停止,转到不同的页面等)。

您可以放心地忽略那些被“sock = client”标记为客户端端的那些,但可能想要调查那些被服务器端关闭的那些(“sock = server”)。

答案 1 :(得分:46)

编辑(2015年8月10日):以下我对H18错误的回答已过时。 Heroku changed the behavior of H18 errors使它们比以前更具体(和严肃)。这个Answer现在更加正确。


H18 Errors

我最近向Heroku支持了大量的H18错误(有时每小时3-4个)我的应用程序正在接收并在新的Heroku仪表板的Metrics部分中显示(上面的屏幕截图)。我引用catsby's response on this thread并要求确认它们是否实际上不可操作。这是我从Heroku支持部门收到的回复:

  

我刚刚在您的应用上浏览了最近24小时的H18。他们都是sock = client并且看着User-Agent我看到很多常见的罪魁祸首。大多数移动浏览器以及我见过其他应用程序的最新Chrome也在几天前也有问题。除非您看到某个特定网址或用户的模式,否则通常只是网络问题。

     

[这些H18错误]不可动作并非总是如此。有些应用确实关心它,有时它也可能意味着客户端崩溃而不是网络错误。浏览器会不时崩溃,但特别是移动浏览器可能非常脆弱。如果一个应用程序使用了大量资产和触发器"页面没有响应"错误你可能会看到H18s的高峰。在这种情况下,有时你可以做些什么。其他应用程序完全在有线网络中进行维护,并且永远不会期望它,在这种情况下可能会出现故障的交换机或防火墙。为了透明起见,我们仍然希望报告这些错误,因为无法判断它们是否可操作。

总而言之,大多数情况下,如果它们出现sock=client错误,您可以忽略它们,但这确实表明客户端正在断开连接,这可能表明存在真正的问题,具体取决于您的应用程序如何与其客户端联网(例如移动或非常糟糕的网络连接)...但可能你可以安全地忽略它们。

答案 2 :(得分:29)

仅供参考:最佳答案不再正确。这是在撰写本文时,但事情已经发生了变化。 H18现在总是sock = server。 Heroku为sock = client添加了一个新的错误代码H27。

详细信息:https://devcenter.heroku.com/changelog-items/662

H18现在应该更加认真对待,因为它们肯定是您服务的问题。 H27通常可以安全地被忽略,因为它们是客户的问题。

答案 3 :(得分:3)

还有一种可能导致此错误的情况不是documented by Heroku

如果您的服务器响应请求并关闭连接而不读取请求正文,则路由器将响应H18错误。 Heroku路由器日志将显示(.|\s)+

在这种情况下,您的服务器在HTTP规范方面没有做错任何事情。这是Heroku路由器的错误。

我已就此与Heroku技术支持联系,他们确认了该问题。它将在他们正在实现的路由器的新版本中修复。

解决方法是始终确保在关闭连接之前在后端服务器上读取请求正文。

答案 4 :(得分:0)

万一有人遇到这种 H18 错误情况 - 该解决方案适用于我使用 Postgresql 和 SQLAlchemy 的简单 Python 3.9.2 Flask 应用程序。

我必须确保每个路由端点函数都明确读取完整的请求正文。就我而言,这与请求或响应消息中的长请求、超时或大数据无关。

我根据我发现的一个帖子将这一行添加到每个函数的顶部来解决这个问题。

@app.route("/store/<int:store_id>")
def get_store_by_id(store_id):
    # ALL requests need to read the full request body on Heroku / Flask
    hack = request.data
...

添加此应用程序后,该应用程序运行良好 - 如果我删除 request.data 调用,该应用程序将随机失败并显示 H18 错误且没有其他诊断。一旦它开始失败,它将开始对所有请求失败。