Rails 4, Puma, Nginx - ActionController :: Live Streaming muere después del primer fragmento enviado

Aquí hay un proyecto básico de Rails 4 que configuré para solucionar mi problema:

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

Tengo una ruta configurada en / home / stream que debería transmitir una línea de texto 5 veces en 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

Cuando ejecuto puma usando tcp: //, sin nginx, la transmisión funciona perfectamente.

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

Y me devuelven las 5 líneas, no hay problema.

Cuando introduzco nginx, curl generará la primera línea pero inmediatamente saldrá después de eso. Sigo viendo la salida de las llamadas de colocación en el servidor y los registros, por lo que sé que la solicitud aún se está procesando en el ciclo 5.times.

Tampoco arroja una excepción IOError como lo haría si el usuario cortara la conexión.

Esto es lo que he probado hasta ahora:

Diferentes combinaciones de directivas nginx en el archivo conf principal y el servidor conf.Cambio de configuración de rieles.Varios ajustes de configuración de puma.Establecer todo tipo de encabezados diferentes en el método del controlador con la esperanza de que se trate de un problema de almacenamiento en caché.

La búsqueda en Internet también ha proporcionado muy poca ayuda.

Estoy perdido y necesito alguna dirección.

Aquí está la salida de ambas llamadas curl, con y sin nginx.

Sin 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
Con 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

Lo interesante, y lo acabo de notar, es que la ubicación de la línea de registro de solicitud de obtención:

"GET / home / stream HTTP / 1.0" 200

es diferente en cada llamada curl y se coloca en relación con la cantidad de texto que se transmite realmente.

¿Alguna idea de lo que está pasando aquí? ¿Por qué los rieles no pueden transmitir todo al usar nginx?

Respuestas a la pregunta(1)

Su respuesta a la pregunta