0

我的 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-BufferingHTTP 响应标头无济于事。我还将 Ubuntu 10.04 的 nginx 0.7 从半官方 ppa 提升到 1.2。

4

1 回答 1

0

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

于 2012-05-29T08:40:15.063 回答