Članak iz serije „beleške na marginama“.
TL:DR:
http2_max_field_size 8k; # sve će spasiti!Na jednom od projekata, nakon promene neke unutrašnje logike backend-a, počeo sam primeć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 googlanje na ovu temu nije donelo konkretne rezultate - jer se tvrdi da se ovakvo ponašanje javlja kada klijent zatvori vezu ne prenoseći zaglavlja. Pa i razna egzotika sa veličinom bafera za wsgi_, što u našem slučaju nikako nije odgovaralo.
U suštini, odlučili smo da problem nije problem, s obzirom na to da na našim obimima to uopšte nije kritično.
Sve do trenutka kada su me suočili sa sledećim problemom: u nekim slučajevima linkovi se bez problema otvaraju preko http, ali potpuno odbijaju raditi preko https, dajući divno: Connection #0 to host example.com left intact
curl: (52) Prazan odgovor od servera
U logovima je ovu stvar bilo moguće pratiti samo po IP-u - ni rekvesta, ni drugih podataka, kao što se može videti iz gornjeg primera - nema. Samo onaj prokleti status 0, ali ja znam da nisam prekinuo zahtev! Počeo sam da kopam šta bi moglo da pođe naopako. A sve se ispostavilo vrlo jednostavno:
listen 443 ssl http2 backlog=8192;
Elem, ako koristite http2 za ssl-veze, nije dovoljno samo konfigurirati bafer zahteva, treba ih konfigurirati i u ngx_http_v2_module, a to jest:
Sintaksa: http2_max_field_size veličina;
Podrazumevano: http2_max_field_size 4k;
Kontekst: http, server
Ograničava maksimalnu veličinu zaglavlja zahteva komprimovanog pomoću HPACK-a. Ograničenje se primenjuje jednako na ime i na vrednost. Ako se koristi Huffmanovo kodiranje, stvarna veličina raskompovanih stringova imena i vrednosti može biti veća. Podrazumevano ograničenje odgovara većini zahteva.
U suštini, to je to. A sve zbog čega? Zato što je dužina linka bila velika - veća od tih 4k.
Povećanjem na, recimo, 8kb (ili onoliko koliko je sigurno dovoljno) - rešavamo problem.
To su stvari.
Izvor: habr.com
