Rails 4, Puma, Nginx - ActionController :: Live Streaming stirbt, nachdem der erste Chunk gesendet wurde

Hier ist ein einfaches Rails 4-Projekt, das ich eingerichtet habe, um mein Problem zu beheben:

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

Ich habe eine Route unter / home / stream eingerichtet, die fünfmal im Abstand von einer Sekunde eine Textzeile streamen soll.

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

Wenn ich puma mit tcp: // ohne nginx starte, funktioniert das Streaming einwandfrei.

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

Und ich bekomme die 5 Zeilen wieder gestreamt, kein Problem.

Wenn ich nginx einführe, gibt curl die erste Zeile aus, wird danach jedoch sofort beendet. Ich sehe weiterhin die Ausgabe der Puts-Aufrufe auf dem Server und die Protokolle, sodass ich weiß, dass die Anforderung immer noch in der 5.x-Schleife verarbeitet wird.

Es wird auch keine IOError-Ausnahme ausgelöst, wie dies der Fall wäre, wenn der Benutzer die Verbindung unterbricht.

Folgendes habe ich bisher versucht:

Verschiedene Kombinationen von Nginx-Direktiven in der Haupt-Conf-Datei und der Server-Conf.Schieneneinstellungen ändern.Verschiedene Puma-Konfigurationseinstellungen.Setzen aller Arten von verschiedenen Headern in der Controller-Methode in der Hoffnung, dass es sich um ein Caching-Problem handelt.

Das Durchsuchen des Internets hat ebenfalls kaum geholfen.

Ich bin ratlos und brauche eine Anweisung.

Hier ist die Ausgabe beider Curl-Aufrufe mit und ohne Nginx.

Ohne 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
Mit 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

Was interessant ist, und ich habe es gerade bemerkt, ist, dass der Speicherort der Protokollzeile get request:

"GET / home / stream HTTP / 1.0" 200

ist bei jedem Curl-Aufruf unterschiedlich und wird in Relation zu der tatsächlich gestreamten Textmenge gesetzt.

Irgendwelche Ideen, was hier los ist? Warum können Rails bei der Verwendung von Nginx nicht alles streamen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage