【问题标题】:Heroku H18 error in a Rails app on an unhandled route未处理路线上的 Rails 应用程序中的 Heroku H18 错误
【发布时间】:2021-03-25 03:56:51
【问题描述】:

我在 Heroku 上遇到了神秘的 H18 错误。这些请求似乎是由在我的应用程序的根 URL 上发送 POST 请求的机器人或爬虫发出的。我担心的是,这些请求在被终止之前都需要超过 30 秒的时间来处理,很可能是超时。这是我的日志文件和指标图的示例:

Dec 14 03:52:26 poll-en heroku/router sock=backend at=error code=H18 desc="Server Request Interrupted" method=POST path="/" host=app.do request_id=72252a6a-d4b5-4ecc-ae3c-bc69c273eb16 fwd="138.201.76.138" dyno=web.1 connect=1ms service=30034ms status=503 bytes=71 protocol=http
Dec 14 04:05:11 poll-en heroku/router sock=backend at=error code=H18 desc="Server Request Interrupted" method=POST path="/" host=app.do request_id=78ea5ae4-9e8a-4c90-b26e-c2eae40116b4 fwd="148.251.231.105" dyno=web.1 connect=0ms service=31392ms status=503 bytes=71 protocol=http
Dec 14 04:19:07 poll-en heroku/router sock=backend at=error code=H18 desc="Server Request Interrupted" method=POST path="/" host=app.do request_id=bcc76545-24e0-4fc7-8e63-a08bb463bb31 fwd="148.251.231.105" dyno=web.1 connect=0ms service=30195ms status=503 bytes=71 protocol=http
Dec 14 04:45:35 poll-en heroku/router sock=backend at=error code=H18 desc="Server Request Interrupted" method=POST path="/" host=app.do request_id=87efe086-9879-4506-a7ac-52504219126d fwd="144.76.141.230" dyno=web.1 connect=0ms service=31733ms status=503 bytes=71 protocol=http

我的应用程序不处理根 URL 上的 POST 请求,我无法使用 cURL 复制错误。可以肯定的是,我还添加了一个机架中间件,它首先运行并终止根 URL 上的所有 POST 请求。所以请求甚至不应该到达 Rails 路由器,但我的日志文件中仍然出现这些 H18 错误。

怎么会这样?什么样的请求甚至没有到达我的应用程序时可能会挂起 30 秒?

【问题讨论】:

  • 您的应用允许http 请求还是仅允许https?我看到请求在请求 http 时需要很长时间才能超时,但该应用仅使用 https 并且重定向存在一些挂断。
  • 我设置了config.force_ssl = true 所以http 请求被重定向到https。我也在用 cURL 测试这个 http 请求,它会立即返回。这是一个真正的难题!
  • @RockwellRice 我想你可能正在做点什么。您是否能够更改配置来解决此问题?
  • 不,在我们的例子中是 DNS 问题。

标签: ruby-on-rails heroku puma


【解决方案1】:

您使用的是什么版本的 Puma,您的 Puma 配置是什么样的?

Heroku documents 在 H18 发生时请求确实到达了您的应用程序:

H18 表示套接字已连接,一些数据已作为应用程序响应的一部分发送,但随后套接字在未完成响应的情况下被销毁。

也许您在 Puma 中遇到了这个错误,听起来请求可能会卡在 Puma 中(永远无法到达您的应用程序):https://github.com/puma/puma/issues/2282(在 Puma 5.0.3 及更高版本中已解决)

您可以尝试将 Puma 配置中的 first_data_timeout 设置为低于 30 秒的时间。那么 Puma 应该在 Heroku 给你 H18 错误之前respond with 408 Request Timeout

【讨论】:

  • 我的应用在最新版本的 Puma (5.1.1) 上运行。我会尝试添加first_data_timeout 配置,看看是否有帮助。我会回来报告的。谢谢!
  • first_data_timeout 设置为 10 秒确实将 H18 超时减少到 10 秒。我仍然不知道如何摆脱这些错误,但至少它不会长时间挂起服务器响应。你知道我可以用这个设置有多激进吗?我可以将其设置为 1 秒,因为我没有看到任何情况下客户端会打开套接字而不发送数据(不在我的应用程序中使用 websockets)。
  • 您是否仍然在日志中看到带有较低 first_data_timeout 的 H18 错误?这对我来说听起来不对。这可能是 Puma 的一个错误。欢迎您在github.com/puma/puma 上打开一个问题,提供更多信息(日志、有关您的应用程序和可能连接到它的客户端的更多信息)。
  • 是的,H18 错误仍然出现在我的日志和指标图表中,只有在达到first_data_timeout 中设置的秒数后才会发生。我不明白为什么这会是一个错误,我很高兴我可以降低此阈值但仍然会收到有关错误的警告。
  • 如果我正确理解 Puma 中的 first_data_timeout 选项,它不应该触发任何 H18。 Puma 应该以 HTTP 状态 408 响应并且它应该是一个完整的响应。这就是为什么我认为这可能是 Puma 的一个错误。 H18 警告对您有用吗?
猜你喜欢
  • 2017-11-18
  • 2013-10-13
  • 1970-01-01
  • 2016-03-11
  • 2018-10-29
  • 1970-01-01
  • 2016-04-01
  • 2014-11-19
  • 2014-03-12
相关资源
最近更新 更多