Поток рельсов генерировал ответ от единорога через nginx
Приложение My Rails генерирует ответ ~10 МБ динамически, например так:
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 или что-то еще) буферизует весь запрос где-то перед его отправкой клиенту.
Сейчас я играл с proxy_buffering off
в конфигурации nginx, а X-Accel-Buffering
HTTP-заголовок ответа безрезультатен. Я также увеличил nginx 0.7 Ubuntu 10.04 до 1.2 с полуофициального ppa.
1 ответ
Оказалось, что 10738118 был в корне поведения. Действительно, отсутствие Last-Modified
в ответ запускает буферизацию где-то в Rails/Rack.