首页 > 解决方案 > Heroku 上的 Rails 应用程序中出现无法解释的 H18 错误

问题描述

我在 Heroku 上的 rails 应用程序有一个非常奇怪的问题,我已经快一个月没能解决了。这是一个仅在生产服务器上发生的问题,我无法在开发中复制,并且日志报告没有错误接受 H18 错误。

这就是正在发生的事情。应用程序可以正常运行大约 12 小时,然后在某个时间点请求数量会激增一点,Heroku 开始定期报告 H18 错误

heroku1 heroku2 此时应用程序并没有完全失败,但是所有调用某种 open-uri 请求的请求都会失败(基本上是对外部 web 服务的请求),返回 500 错误。仅显示静态视图的正常请求似乎仍然可以继续工作。

日志不是特别有用。

几乎每个 H18 错误都与 /robots.txt 的请求相关联,但至少有一个错误与资产请求相关联:“/assets/application-38a4580edd72e30f34ea76583ab7e1b1b5654c72a6313ece935177d23b0398d3.css”

以下是摘录

Oct 10 21:09:32 lombardpress-web heroku/router: sock=backend at=error code=H18 desc="Server Request Interrupted" method=GET path="/robots.txt" host=scta.lombardpress.org request_id=e0e344d1-0349-4b0a-8db0-3c6e3ad3e99f fwd="157.55.39.188" dyno=web.1 connect=0ms service=209ms status=503 bytes= protocol=http Oct 10 21:09:41 lombardpress-web heroku/router: sock=backend at=error code=H18 desc="Server Request Interrupted" method=GET path="/assets/application-38a4580edd72e30f34ea76583ab7e1b1b5654c72a6313ece935177d23b0398d3.css" host=scta.lombardpress.org request_id=fdd88ca2-140e-4051-9011-4d81ca218f19 fwd="157.55.39.206" dyno=web.1 connect=0ms service=252ms status=503 bytes= protocol=http Oct 10 21:33:55 lombardpress-web heroku/router: sock=backend at=error code=H18 desc="Server Request Interrupted" method=GET path="/robots.txt" host=scta.lombardpress.org request_id=5aa463f5-43ff-4b74-a2de-e944aa9d2387 fwd="46.229.168.147" dyno=web.1 connect=0ms service=254ms status=503 bytes= protocol=http Oct 10 21:38:23 lombardpress-web heroku/router: sock=backend at=error code=H18 desc="Server Request Interrupted" method=GET path="/robots.txt" host=scta.lombardpress.org request_id=2300949d-8998-4ed0-a4ab-bf1975e93cc6 fwd="216.244.66.197" dyno=web.1 connect=0ms service=220ms status=503 bytes= protocol=http

一旦错误开始,我只需要重新启动应用程序,对于另外 12 个左右的错误,一切都会再次正常。甚至对 robots.txt 的请求。但大约 12 小时后,同样的问题出现了。

由于网络爬虫,我估计应用程序每 2-4 秒就会收到一个请求。否则它不是一个流量特别高的网站。

Heroku 只提供最小的反馈

在后端返回 HTTP 响应之前,属于您应用程序的 Web 进程的后端套接字已关闭。这发生在应用程序或 Web 服务器级别,因此我们无法提供太多额外的见解。您可以看到请求在您的应用程序服务中花费了一些时间=1118ms,然后返回状态 500。我想知道中间件(也许您有一个发出外部请求?)在它到达您的实际 Rails 堆栈之前是否失败。我建议从那里开始。

该代码是开源的,如果有人有兴趣四处寻找,可以在这里获得:https ://github.com/lombardpress/lombardpress-web

如果有任何想法或建议,我将不胜感激。我已经为此苦苦挣扎了一段时间,我不知道如何解决这个问题。

标签: ruby-on-railsheroku

解决方案


推荐阅读