[Nginx] Com derrotar response_status = 0

Un article de la categoria de "notes al marge".

TL: DR:

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

En un dels projectes, després de canviar alguna lògica interna del backend, vaig començar a observar un estrany response_code als registres, és a dir, 0. Als registres sembla una cosa així:

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


Llegir la documentació i buscar a Google sobre aquest tema no va donar absolutament res, perquè... S'afirma que aquest comportament es produeix quan el client va tancar la connexió sense passar les capçaleres. Bé, i diverses coses exòtiques amb la mida del buffer per a wsgi_, que en el nostre cas no encaixa amb la paraula "de cap manera".

En general, vam decidir que el problema no és un problema, tenint en compte que als nostres volums no és gens crític.

Exactament fins que em va sorprendre el següent problema: en alguns casos, els enllaços s'obren sense problemes a través de http, però es neguen completament a funcionar mitjançant https, produint el meravellós: la connexió #0 per host example.com deixa intacte
curl: (52) Resposta buida del servidor

Als registres, només vam poder fer un seguiment d'aquesta cosa per IP: no hi havia cap sol·licitud ni cap altra dada, com es pot veure a l'exemple anterior. Només l'estat notori és 0, però sé que no vaig interrompre la sol·licitud! Vaig començar a esbrinar què podia sortir malament. I tot va resultar molt senzill:

escolta 443 ssl http2 endarreriment=8192;

Bé, si utilitzeu http2 per a connexions ssl, no n'hi ha prou amb configurar els buffers de sol·licitud, també s'han de configurar a ngx_http_v2_module, és a dir:

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

Limita la mida màxima d'una capçalera de sol·licitud comprimida mitjançant HPACK. La restricció s'aplica per igual tant al nom com al valor. Si s'utilitza la codificació Huffman, la mida real de les cadenes de valor i nom descomprimits pot ser més gran. El límit predeterminat és adequat per a la majoria de consultes.

En general, això és tot. I per què tot? Perquè la longitud de l'enllaç era llarga, més llarga que els mateixos 4k.

En establir-lo, per exemple, a 8 kb (o tant com és probable que sigui suficient), resolem el problema.
I així segueix.

Font: www.habr.com

Afegeix comentari