Wie deaktiviere ich 'Transfer-Encoding: chunked' encoding im Lack?
Mit Lack 4, habe ich eine Reihe von backends, die sind reagiert mit einem gültigen Content-Length
header und kein Transfer-Encoding
header.
Auf den ersten Treffer von einem client aus, vielmehr als Reaktion auf den client mit diesen Headern, Lack fallen die Content-Length
header und hinzufügen Transfer-Encoding: chunked
auf die Antwort. (Interessanterweise, die Nutzlast scheint nicht irgendwelche Brocken in es - es ist eine zusammenhängende payload).
Dies führt zu erheblichen Problemen für Kunden wie Flash-video-Player, die versuchen zu tun, segment-Größe, Bandbreite, etc Analyse basiert auf der Content-Length
header. Ihre Analyse schlägt fehl, und Sie können nicht Dinge wie multi-bitrate-streaming, etc.
Habe ich versucht eine Reihe von semi-offensichtlichen Dinge wie:
beresp.do_stream = true
beresp.do_gzip = false
unset req.http.Accept-Encoding
Probe-backend-Reaktion:
HTTP/1.1 200 OK
Cache-Control: public, max-age=600
Content-Type: video/mp4
Date: Tue, 13 May 2014 19:44:35 GMT
Server: Apache
Content-Length: 796618
Connection: keep-alive
Beispiel Lack Antwort:
HTTP/1.1 200 OK
Server: Apache
Cache-Control: public, max-age=600
Content-Type: video/mp4
Date: Tue, 13 May 2014 23:10:06 GMT
X-Varnish: 2
Age: 0
Transfer-Encoding: chunked
Accept-Ranges: bytes
Nachfolgender Belastung des Objekts tun einschließlich der Content-Length
header, nicht nur der erste laden in den cache.
VCL: https://gist.github.com/onethumb/e64a405cc579909cace1
varnishlog Ausgabe: https://gist.github.com/onethumb/e66a2bc4727a3a5340b6
Lack Trac: https://www.varnish-cache.org/trac/ticket/1506
InformationsquelleAutor Don MacAskill | 2014-05-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorerst
do_stream = false
wird tun, was Sie wollen.Vermeidung von chunked-encoding für den Fall, wo das backend sendet unchunked ist eine mögliche zukünftige Verbesserung zu Lackieren.
Beispiel:
Ich habe versucht
set beresp.do_stream=false
bereits, mit dem gleichen Ergebnis. 🙁Ich sollte klären, dass ich jetzt getan habe, weitere Tests durchzuführen.
beresp.do_stream=false
Verbesserung der Erfolgsquote, aber Fehler immer noch auftreten. Ich bin Taktung von mindestens 10% der rate, mit der dieses problem auch mitdo_stream
eingestelltfalse
Deine Antwort ist toll, da es fein Punkte aus der relativen code könnte hilfreich sein für Neulinge (man könnte Sie nicht über die nötigen Ruf zum anzeigen der Antwort). Danke und +1 Hier auf jeden Fall =)
Einfach nur neugierig, probiere die Aktivierung ESI pro meine Antwort und sehen, ob das funktioniert. Ich bekomme 100% Erfolgsquote.
InformationsquelleAutor Nils Goroll
Also, die Lösung ist überhaupt nicht intuitiv, sondern müssen Sie aktivieren esi-Verarbeitung:
Also habe ich entdeckt, indem Sie der Quellcode.
Insbesondere, Lack:
Der obige code setzt die
res_mode
Flagge.Wenig später:
Dieser legt die
res_mode
Flagge zuRES_CHUNKED
wenn das HTTP-Protokoll istHTTP/1.1
oder höher (das ist es in deinem Beispiel) und die res_mode flag nicht gesetzt. Jetzt, auch für später:Lack sendet die chuncked transfer-Codierung, wenn die
RES_CHUNKED
- flag gesetzt ist.Den nur so wie ich das sehe, effektiv zu deaktivieren, ist dies durch Aktivierung der ESI-Modus. Es wird deaktiviert, die in ein paar andere Möglichkeiten, aber die sind nicht praktisch (z.B. für HTTP HEAD-Anfragen oder Seiten mit 304 status-code).
if (!(req->res_mode & (RES_LEN|RES_CHUNKED|RES_EOF)))
überprüft, obres_mode
flag hat entwederRES_LEN
,RES_CHUNKED
oderRES_EOF
gesetzt, aber der code innerhalbif (!req->disable_esi && req->obj->esidata != NULL)
nur unsetRES_LEN
- und set -RES_ESI
. Und nach hier, dieContent-Length
wird gestrippt werden, irgendwann?Ich glaube nicht, dass diese Werke nicht mehr im Lack 4.
InformationsquelleAutor Brandon Wamboldt
Aktualisiert aus Lack 4.0 auf 5.2, und nun dies funktioniert einwandfrei auch bei der 1. Anfrage.
InformationsquelleAutor Piotr Jankowski