通过 nginx 流式传输来自独角兽的 rails 生成的响应

Posted

技术标签:

【中文标题】通过 nginx 流式传输来自独角兽的 rails 生成的响应【英文标题】:Streaming a rails generated response from unicorn through nginx 【发布时间】:2012-05-24 12:55:32 【问题描述】:

我的 Rails 应用程序会动态生成大约 10MB 的响应,如下所示:

self.status_code = 200
self.response-body = Enumerator.new  |y| ... 

通过unicorn_rails 在开发模式下启动应用程序我可以curl http://127.0.0.1:3000/foo > /dev/null 并看到响应通过进度反馈流式传输到客户端。使用rails server(启动 webrick)时,没有流式传输,我看到进度在那里,然后从 0% 跳到 100%。

然而,在 staging/production 上部署时,unicorn 位于 nginx 和 unix 套接字之后。在该配置中,类似的curl http://staging/foo > /dev/null 在生成数据时看到进度为 0%,然后在传输时从 0% 到 100%,就像没有流式传输一样。事实上,通过查看服务器日志,我可以看到 curl 在生成请求的整个过程中一直在等待,并且一旦请求完成,curl 在接收数据时就会涓涓细流。

我的假设是某些东西(nginx 或其他什么)在将整个请求实际发送到客户端之前将其缓冲在某处。

目前我在 nginx 配置中使用了 proxy_buffering off,而 X-Accel-Buffering HTTP 响应标头无济于事。我还将 Ubuntu 10.04 的 nginx 0.7 从半官方 ppa 升级到 1.2。

【问题讨论】:

【参考方案1】:

原来10738118 是行为的根源。实际上,响应中缺少 Last-Modified 会触发 Rails/Rack 中某处的缓冲。

【讨论】:

以上是关于通过 nginx 流式传输来自独角兽的 rails 生成的响应的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby on Rails 3.2+ 中流式传输部分视图

如何通过 nginx 将 rtsp 网络摄像机流式传输到网站

使用 HAML 的 Rails HTTP 流式传输

Rails 3.1 http 流式传输——js 在头部还是底部?

无法从 nginx-rtmp 获得破折号流式传输

使用 Rack::Deflater 时,Rails 中的 HTTP 流式传输不起作用