我的Rails應用程序動態生成〜10MB響應,像這樣:串流播放軌產生的通過nginx的從麒麟響應
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%。
然而,在部署/製作時,獨角獸坐落在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。