[Nginx] So besiegen Sie Response_status = 0

Ein Artikel aus der Kategorie „Nebenbemerkungen“.

TL: DR:

http2_max_field_size 8k; # всех спасет!

Bei einem der Projekte begann ich, nachdem ich einige interne Logik des Backends geändert hatte, einen seltsamen Antwortcode in den Protokollen zu beobachten, nämlich 0. In den Protokollen sieht es in etwa 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 ergaben absolut nichts – weil ... Es wird angegeben, dass dieses Verhalten auftritt, wenn der Client die Verbindung geschlossen hat, ohne die Header zu übergeben. Nun, und diverse exotische Dinge mit der Puffergröße für wsgi_, die in unserem Fall nicht zum Wort „in irgendeiner Weise“ passten.

Im Allgemeinen sind wir zu dem Schluss gekommen, dass das Problem kein Problem ist, da es bei unseren Lautstärken überhaupt nicht kritisch ist.

Genau bis mich folgendes Problem verwirrte: In manchen Fällen öffnen sich Links ohne Probleme über http, verweigern aber komplett die Funktion über https und produzieren das Wunderbare: Verbindung Nr. 0 zum Host example.com bleibt intakt
curl: (52) Leere Antwort vom Server

In den Protokollen konnten wir dieses Ding nur anhand der IP verfolgen – es gab keine Anfrage oder andere Daten, wie aus dem obigen Beispiel ersichtlich ist. Nur der berüchtigte Status ist 0, aber ich weiß, dass ich die Anfrage nicht unterbrochen habe! Ich begann herauszufinden, was schief gehen könnte. Und es stellte sich heraus, dass alles ganz einfach war:

höre 443 ssl http2 Rückstand=8192;

Nun, wenn Sie http2 für SSL-Verbindungen verwenden, reicht es nicht aus, nur die Anforderungspuffer zu konfigurieren, sie müssen auch in ngx_http_v2_module konfiguriert werden, nämlich:

Синтаксис:	http2_max_field_size размер;
Умолчание:	http2_max_field_size 4k;
Контекст:	http, server

Begrenzt die maximale Größe eines mit HPACK komprimierten Anforderungsheaders. Die Einschränkung gilt gleichermaßen für den Namen und den Wert. Wenn die Huffman-Kodierung verwendet wird, kann die tatsächliche Größe der entpackten Namens- und Wertzeichenfolgen größer sein. Der Standardgrenzwert ist für die meisten Abfragen geeignet.

Im Allgemeinen ist es das. Und warum alle? Weil die Länge des Links lang war – länger als die gleichen 4 KB.

Indem wir es beispielsweise auf 8 KB einstellen (oder so viel, wie wahrscheinlich ausreicht), lösen wir das Problem.
Solche Sachen.

Source: habr.com

Kommentar hinzufügen