[Nginx] Come risolvere response_status = 0

Articolo di tipo «appunti laterali».

TL:DR:

http2_max_field_size 8k; # salverà tutti!

In uno dei progetti, dopo aver modificato alcune logiche interne del backend, ho cominciato a notare un strano response_code nei log, precisamente — 0. Nei log appare più o meno così:

{
  "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": ""
}


Leggere la documentazione e cercare su Google riguardo a questo argomento non ha portato a nulla — poiché si afferma che questo comportamento si verifica quando il client chiude la connessione senza inviare intestazioni. E c'era anche un po' di esotismo con le dimensioni del buffer per wsgi_, che nel nostro caso non erano affatto adatte.

In generale, abbiamo deciso che il problema non era un problema, considerando che sui nostri volumi non era affatto critico.

Fino a quando non mi è stata posta la seguente domanda: in alcuni casi, i link si aprono senza problemi via http, ma rifiutano completamente di funzionare via https, dando un meraviglioso: Connection #0 to host example.com left intact
curl: (52) Risposta vuota dal server

Nei log vengono tracciati solo tramite IP — non ci sono richieste né altri dati, come mostrato nell'esempio sopra. Solo il famigerato stato 0, ma so che non ho interrotto la richiesta! Ho iniziato a scavare per capire cosa potesse andare storto. E tutto si è rivelato molto semplice:

listen 443 ssl http2 backlog=8192;

Quindi, se si utilizza http2 per le connessioni SSL, non è sufficiente configurare i buffer delle richieste, ma è necessario configurarli anche in ngx_http_v2_module, precisamente:

Sintassi:	http2_max_field_size dimensione;
Predefinito:	http2_max_field_size 4k;
Contesto:	http, server

Limita la dimensione massima dell'intestazione della richiesta, compressa usando HPACK. La limitazione si applica in egual modo sia al nome che al valore. Se viene utilizzata la codifica Huffman, la dimensione effettiva delle stringhe decompresse di nome e valore può essere maggiore. La limitazione predefinita si adatta alla maggior parte delle richieste.

Insomma, è tutto qui. E perché? Perché la lunghezza del link era lunga — più di quei famosi 4k.

Impostandolo, ad esempio, a 8kb (o quanto basta) — risolviamo il problema.
Queste sono le situazioni.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster