写入 EC2 实例上的关闭流不会导致 IOError

Writing to closed stream on EC2 instance does not result in IOError

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

当我关闭连接到本地计算机上的流端点的浏览器 window 时,所有内容都已正确清理。

当我在 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

我最终放弃了 ActionController::Live,只使用了优秀的 Tubesock 库。即使切换,我也必须遵循一些记录很差的步骤。

首先,您必须在您的 nginx 配置文件中启用 HTTP v1.1,因为 v1.0 不支持 chunked-encoding。

proxy_http_version 1.1;

并且您还必须将连接 header 设置为空字符串

proxy_set_header Connection "";

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

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

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