Ein Artikel der Gattung âNotizen am Randeâ.
TL:DR:
http2_max_field_size 8k; # wird alle retten!In einem der Projekte begann ich, nach einer Ănderung der internen Logik im Backend einen seltsamen response_code in den Logs zu beobachten, nĂ€mlich â 0. In den Logs sieht es ungefĂ€hr so aus:
{
"timestamp": "2020-01-17T08:41:51+00:00",
"remote_addr": "zzz.zzz.zzz.zzz",
"request_time": 0,
"upstream_response_time": "",
"upstream_header_time": "",
"http_accept_language": "-language",
"response_status": 0,
"request": "",
"host": "example.com",
"upstream_addr": "",
"http_referrer": "",
"request_length": 5854,
"bytes_sent": 0,
"http_user_agent": ""
}
Das Lesen der Dokumentation und das Googeln zu diesem Thema hat genau nichts ergeben â da behauptet wird, dass solches Verhalten auftritt, wenn der Client die Verbindung schlieĂt, ohne die Header zu ĂŒbermitteln. Und es gibt verschiedene Exoten beim Umfang des Buffers fĂŒr wsgi_, die in unserem Fall ĂŒberhaupt nicht passten.
Insgesamt entschieden wir, dass das Problem â kein Problem ist, wenn man bedenkt, dass es bei unseren Volumina völlig unkritisch ist.
Genau bis zu dem Moment, als ich mit dem nĂ€chsten Problem konfrontiert wurde: In einigen FĂ€llen öffneten Links problemlos ĂŒber http, weigerten sich jedoch völlig, ĂŒber https zu funktionieren, und lieferten das wunderbare: Connection #0 to host example.com left intact
curl: (52) Leere Antwort vom Server
In den Logs konnte ich dieses Problem nur ĂŒber die IP nachverfolgen â keine Anfrage und keine weiteren Daten, wie aus dem obigen Beispiel ersichtlich â vorhanden. Nur der berĂŒchtigte Status 0, aber ich weiĂ, dass ich die Anfrage nicht abgebrochen habe! Ich begann zu stöbern, was falsch laufen könnte. Und alles stellte sich als sehr einfach heraus:
listen 443 SSL http2 backlog=8192;
Also â wenn man http2 fĂŒr ssl-Verbindungen verwendet, reicht es nicht aus, nur die Anfrage-Puffer zu konfigurieren, man muss sie auch im ngx_http_v2_module konfigurieren, nĂ€mlich:
Syntax: http2_max_field_size GröĂe;
Vorgabe: http2_max_field_size 4k;
Kontext: http, server
Begrenzt die maximale GröĂe des Anforderungsheaders, der mit HPACK komprimiert wurde. Die Begrenzung gilt sowohl fĂŒr den Namen als auch fĂŒr den Wert. Wenn Huffman-Codierung verwendet wird, kann die tatsĂ€chliche GröĂe der entpackten Namens- und Wert-Strings gröĂer sein. Die Standardgrenze eignet sich fĂŒr die meisten Anfragen.
Im Grunde ist das alles. Und warum? Weil die LĂ€nge des Links groĂ war â gröĂer als die besagten 4k.
Wenn man ihn beispielsweise auf 8kb (oder so viel, wie sicher ausreicht) festlegt, löst man das Problem.
So ist das.
Quelle: habr.com
