Članak iz kategorije «bilješke na margini».
TL:DR:
http2_max_field_size 8k; # sve će spasiti!Na jednom od projekata, nakon promjene određene unutarnje logike backend-a, počeo sam primjećivati čudan response_code u logovima, a to je - 0. U logovima izgleda otprilike ovako:
{
"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": ""
}
Čitanje dokumentacije i pretraživanje interneta na tu temu nije donijelo ništa konkretno - jer se tvrdi da se ovo ponašanje javlja kada klijent zatvori vezu bez slanja zaglavlja. A tu su i razne egzotike s veličinom bafera za wsgi_, što u našem slučaju nije odgovaralo ni u kojem smislu.
U cjelini, odlučili smo da problem nije problem, s obzirom na to da kod naših volumena to nije kritično.
Sve do trenutka kada me nisu zaintrigirali sljedećim problemom: u nekim slučajevima, linkovi se bez problema otvaraju putem http, ali se potpuno odbijaju raditi putem https, prikazujući divno: Connection #0 to host example.com left intact.
curl: (52) Prazan odgovor od servera
U logovima se ovu stvar uspjelo pratiti samo po IP-u - nema zahtjeva, niti drugih podataka, kao što je vidljivo iz gornjeg primjera - nema. Samo prokleti status 0, ali ja znam da nisam prekinuo zahtjev! Počeo sam istraživati što bi moglo poći po zlu. A sve se pokazalo vrlo jednostavnim:
listen 443 Uklonjena je neiskorištena tabela INFORMATION_SCHEMA.TABLESPACES. http2 backlog=8192;
Dakle, ako koristite http2 za ssl-veze, nije dovoljno samo konfigurirati bafer zahtjeva, treba ih konfigurirati i u ngx_http_v2_module, a točno:
Sintaksa: http2_max_field_size veličina;
Zadano: http2_max_field_size 4k;
Kontekst: http, server
Ograničava maksimalnu veličinu zaglavlja zahtjeva, komprimirane pomoću HPACK. Ograničenje se jednako primjenjuje na ime i na vrijednost. Ako se koristi Huffman kodiranje, stvarna veličina raspakiranih nizova imena i vrijednosti može biti veća. Zadano ograničenje odgovara većini zahtjeva.
Uglavnom, to je to. A zašto? Zato što je duljina linka bila velika - veća od onih 4k.
Postavivši je na, na primjer, 8kb (ili koliko god sigurno treba) - rješavamo problem.
Takve stvari.
Izvor: habr.com
