[Nginx] Come sconfiggere Response_status = 0

Un articolo della categoria “note a margine”.

TL: DR:

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

Su uno dei progetti, dopo aver modificato alcune logiche interne del backend, ho iniziato a osservare uno strano codice di risposta nei log, vale a dire 0. Nei log è simile a questo:

{
  "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 questo argomento non ha prodotto assolutamente nulla, perché... Si precisa che questo comportamento si verifica quando il client chiude la connessione senza passare le intestazioni. Bene, e varie cose esotiche con la dimensione del buffer per wsgi_, che nel nostro caso non si adattava in alcun modo alla parola "in alcun modo".

In generale, abbiamo deciso che il problema non è un problema, tenendo conto del fatto che ai nostri volumi non è affatto critico.

Esattamente finché non sono rimasto perplesso dal seguente problema: in alcuni casi, i collegamenti si aprono senza problemi tramite http, ma si rifiutano completamente di funzionare tramite https, producendo il meraviglioso: Connessione n. 0 all'host example.com lasciata intatta
curl: (52) Risposta vuota dal server

Nei log siamo riusciti a tracciare questa cosa solo tramite IP: non c'erano richieste o altri dati, come si può vedere dall'esempio sopra. Solo lo stato noto è 0, ma so di non aver interrotto la richiesta! Ho iniziato a capire cosa poteva andare storto. E tutto si è rivelato molto semplice:

ascolta 443 ssl http2 arretrato=8192;

Bene, se usi http2 per le connessioni SSL, non è sufficiente configurare solo i buffer delle richieste, devono anche essere configurati in ngx_http_v2_module, vale a dire:

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

Limita la dimensione massima di un'intestazione di richiesta compressa utilizzando HPACK. Il vincolo si applica allo stesso modo sia al nome che al valore. Se viene utilizzata la codifica Huffman, la dimensione effettiva delle stringhe di nome e valore decompresse potrebbe essere maggiore. Il limite predefinito è adatto alla maggior parte delle query.

In generale, questo è tutto. E perché tutto? Perché la lunghezza del collegamento era lunga, più lunga degli stessi 4k.

Impostandolo, ad esempio, su 8kb (o quanto probabilmente sarà sufficiente), risolviamo il problema.
Tali casi.

Fonte: habr.com

Aggiungi un commento