Rails 4, Puma, Nginx - ActionController :: A transmissão ao vivo morre após a primeira parte enviada

Aqui está um projeto básico do Rails 4 que eu configurei para solucionar meu problema:

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

Eu tenho uma rota configurada em / home / stream que deve transmitir uma linha de texto 5 vezes em intervalos de 1 segundo.

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

Quando executo o puma usando tcp: //, sem o nginx, o streaming funciona perfeitamente.

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

E recebo as 5 linhas transmitidas de volta, sem problemas.

Quando eu introduzo o nginx, o curl gera a primeira linha, mas sai imediatamente depois disso. Continuo vendo a saída das chamadas de put no servidor e nos logs, então sei que a solicitação ainda está sendo processada no loop 5.times.

Ele também não lança uma exceção IOError como faria se o usuário cortasse a conexão.

Aqui está o que eu tentei até agora:

Diferentes combinações de diretivas nginx no arquivo conf principal e no servidor conf.Alterando as configurações de trilhos.Várias configurações de configuração do puma.Definir todos os tipos de cabeçalhos diferentes no método do controlador na esperança de que fosse um problema de armazenamento em cache.

Pesquisando na internet também ofereceu muito pouca ajuda.

Estou perdida e preciso de alguma direção.

Aqui está o resultado de ambas as chamadas curl, com e sem nginx.

Sem 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
Com 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

O que é interessante, e acabei de notar, é que o local da linha de log de solicitação de obtenção:

"GET / home / fluxo HTTP / 1.0" 200

é diferente em cada chamada espiral e é colocado em relação à quantidade de texto realmente transmitida.

Alguma idéia do que está acontecendo aqui? Por que os trilhos não podem transmitir a coisa toda ao usar o nginx?

questionAnswers(1)

yourAnswerToTheQuestion