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?