我的 Rails 应用程序会动态生成 ~10MB 响应,如下所示:
self.status_code = 200
self.response-body = Enumerator.new { |y| ... }
unicorn_rails
通过I can以开发模式启动应用程序,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 或其他)在将整个请求实际发送到客户端之前将其缓冲在某处。
目前我已经proxy_buffering off
在 nginx 配置中使用过,并且X-Accel-Buffering
HTTP 响应标头无济于事。我还将 Ubuntu 10.04 的 nginx 0.7 从半官方 ppa 提升到 1.2。