[Nginx] So schlagen Sie response_status = 0

Ein Artikel aus der Kategorie "Randnotizen".

TL: DR:
http2_max_field_size 8k; #  ! 


In einem der Projekte habe ich nach dem Ändern einer internen Backend-Logik einen seltsamen response_code in den Protokollen festgestellt, nämlich 0. In den Protokollen 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": "" } 

Lesen der Dokumentation und googeln zu diesem Thema hat absolut nichts gebracht - weil Es wird argumentiert, dass dieses Verhalten auftritt, wenn der Client die Verbindung schließt, ohne die Header zu übergeben. Nun, verschiedene Exoten mit der Größe des Puffers für wsgi_, die in unserem Fall nicht zum Wort "no way" passten.

Im Allgemeinen haben sie entschieden, dass das Problem kein Problem ist, da es auf unseren Volumes absolut nicht kritisch ist.

Genau bis ich durch das folgende Problem verwirrt wurde: In einigen Fällen öffnen sich Links ohne Probleme über http, aber lehnen es vollständig ab, über https zu arbeiten
curl: (52) Leere Antwort vom Server

Es war möglich, diese Sache in den Protokollen nur nach IP zu verfolgen - es gab keine Anfrage oder andere Daten, wie aus dem obigen Beispiel ersichtlich. Nur der notorische Status 0, aber ich weiß, dass ich die Anfrage nicht unterbrochen habe! Ich fing an herauszufinden, was schief gehen könnte. Und alles stellte sich als sehr einfach heraus:

listen 443 ssl http2 backlog = 8192;

Wenn Sie http2 für SSL-Verbindungen verwenden, reicht es nicht aus, nur die Anforderungspuffer zu konfigurieren, sondern Sie müssen sie auch in ngx_http_v2_module konfigurieren:

 : http2_max_field_size ; : http2_max_field_size 4k; : http, server 

Beschränkt die maximale Größe des mit HPACK komprimierten Anforderungsheaders. Die Einschränkung gilt gleichermaßen für den Namen und den Wert. Wenn Huffman-Codierung verwendet wird, kann die tatsächliche Größe der entpackten Zeichenfolgen aus Name und Wert größer sein. Die Standardeinschränkung ist für die meisten Abfragen geeignet.

Im Allgemeinen ist es das. Und warum? Weil die Länge der Verbindung lang war - mehr als die gleichen 4k.

Wenn Sie es zum Beispiel in 8 KB (oder so viel wie wahrscheinlich genug) eingeben, lösen wir das Problem.
Solche Sachen.

Source: https://habr.com/ru/post/de484330/


All Articles