通过 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 网络摄像机流式传输到网站