2012-05-24 3 views
0

Моего 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% по мере его передачи, как если бы потоковая передача не была. В самом деле, глядя на серверные журналы в стороне, я вижу, что завиток сидит, ожидая все время, когда запрос сгенерирован, и как только запрос завершается, завиток стекает, когда он получает данные.

Мое предположение заключается в том, что что-то (nginx или что-то другое) буферизует весь запрос где-то, прежде чем отправлять его клиенту.

На данный момент я играл с proxy_buffering off в конфигурации nginx, а заголовок ответа HTTP X-Accel-Buffering безрезультатно. Я также столкнулся с nginx 0.7 от Ubuntu 10.04 до 1.2 от полуофициального ppa.

ответ

0

Оказалось, что в основе поведения лежит 10738118. В самом деле, отсутствие Last-Modified в ответных триггерах буферизует где-то в Rails/Rack.