Rails 4, Puma, Nginx - ActionController :: Live Streaming умирает после отправки первого чанка

Вот голый Rails 4 проект, который я настроил для решения моей проблемы:

https://github.com/rejacobson/rails4-streamtest

У меня есть маршрут, настроенный в / home / stream, который должен передавать строку текста 5 раз с интервалом в 1 секунду.

def stream
  5.times do |n|
    puts "Streaming: #{n}"
    response.stream.write "Streaming: #{n+1}"
    sleep 1
  end
rescue IOError => e
  puts 'Connection closed'
ensure
  response.stream.close
end

Когда я запускаю puma, используя tcp: //, без nginx, потоковая передача работает отлично.

curl -N http://localhost:3000/home/stream

И я получаю 5 строк обратно без проблем.

Когда я представлю nginx, curl выведет первую строку, но сразу после этого выйдет. Я продолжаю видеть выходные данные вызовов put на сервере и журналы, поэтому знаю, что запрос все еще обрабатывается в цикле 5.times.

Он также не генерирует исключение IOError, как если бы пользователь обрезал соединение.

Вот что я пробовал до сих пор:

Различные комбинации директив nginx в основном файле conf и на сервере conf.Изменение настроек рельсов.Различные настройки конфигурации Puma.Установка всевозможных различных заголовков в методе контроллера в надежде, что это проблема кэширования.

Поиск в Интернете также дал очень мало помощи.

Я в растерянности и нуждаюсь в каком-то направлении.

Вот результат обоих вызовов curl с nginx и без него.

Без nginx
~/projects/streamtest ▰ master ▰
ryan mirage ▰▰▰▰ curl -i -N http://192.168.1.100:3000/home/stream
HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
Cache-Control: no-cache
Content-Type: text/html; charset=utf-8
Set-Cookie: request_method=GET; path=/
X-Request-Id: 9ce86358-4476-404a-97e5-769c16ec7b0c
X-Runtime: 0.978099
Transfer-Encoding: chunked

Streaming: 1Streaming: 2Streaming: 3Streaming: 4Streaming: 5

puma.stdout

Streaming: 0
Streaming: 1
Streaming: 2
Streaming: 3
Streaming: 4
[8048] 192.168.1.100 - - [14/Mar/2014 21:04:50] "GET /home/stream HTTP/1.1" 200 - 6.0661
С nginx
~/projects/streamtest ▰ master ▰
ryan mirage ▰▰▰▰ curl -i -N http://192.168.1.100:3000/home/stream
HTTP/1.1 200 OK
Server: nginx/1.4.5
Date: Sat, 15 Mar 2014 04:02:40 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-UA-Compatible: chrome=1
ETag: "a505e0aa3b11b25301a9a704252a519a"
Cache-Control: max-age=0, private, must-revalidate
Set-Cookie: request_method=GET; path=/
X-Request-Id: 8983d199-026b-4082-a5f1-f1d6c886a3d6
X-Runtime: 0.016516

Streaming: 1

puma.stdout

Streaming: 0
[7558] 192.168.1.100 - - [14/Mar/2014 21:02:40] "GET /home/stream HTTP/1.0" 200 - 0.0214
Streaming: 1
Streaming: 2
Streaming: 3
Streaming: 4

Что интересно, и я только что это заметил, это то, что расположение строки журнала запросов get:

"GET / home / stream HTTP / 1.0" 200

отличается в каждом вызове curl и размещается в зависимости от того, сколько текста на самом деле передается.

Есть идеи, что здесь происходит? Почему рельсы не могут транслировать все это при использовании nginx?

Ответы на вопрос(1)

Ваш ответ на вопрос