【问题标题】:Writing to closed stream on EC2 instance does not result in IOError写入 EC2 实例上的关闭流不会导致 IOError
【发布时间】:2015-01-24 16:19:35
【问题描述】:

我的应用程序有一个流式处理端点,我在其中使用 ActionController::Live。在我的控制器操作中,写入流的所有代码都包含在 begin rescue 确保块中,以便我可以清理我正在使用的资源。

当我关闭连接到本地计算机上的流式处理端点的浏览器窗口时,一切都已正确清理。

当我对在 ELB 后面运行的应用程序执行相同操作时,使用 nginx 反向代理到我的 puma 服务器,控制器操作并不表示它已收到错误,在我的 nginx 错误日志中我得到了

*11820 connect() to unix:///var/run/puma/my_app.sock failed (11: Resource temporarily unavailable) while connecting to upstream

作为参考,我的控制器操作如下所示:https://gist.github.com/teddythetwig/b5c6396993030a18aac5

【问题讨论】:

  • 我遇到了类似的问题。你的 nginx.conf 是什么样的?

标签: ruby-on-rails-4 nginx streaming server-sent-events puma


【解决方案1】:

我最终放弃了 ActionController::Live,只使用了出色的 Tubesock 库。即使进行了切换,我也不得不遵循一些记录不充分的步骤。

首先,您必须在您的 nginx 配置文件中启用 HTTP v1.1,因为 v1.0 不支持分块编码。

proxy_http_version 1.1;

您还必须将 Connection 标头设置为空字符串

proxy_set_header Connection "";

接下来,您必须在您的 ELB 实例上启用代理协议,恕我直言,这有点让人头疼。 Here 是来自亚马逊的一些说明。

我最终退出 AC::Live 并切换到 Websockets 的部分是在 nginx 上玩 keepalive 时间和 ELB 上的空闲超时。

老实说,如果您想以这种方式保持连接,我建议您切换到 Websockets。 ActionController::Live 并不是完成我们想要做的事情的最佳方式。它非常适合以愚蠢的方式流式传输数据(控制器操作将在执行 x、y 和 z 后终止)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-13
    • 2014-09-14
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多