Článek tohoto typu je „poznámky na okrajích“.
TL:DR:
http2_max_field_size 8k; # všechno spasí!Na jednom z projektů, po změně některé interní logiky backendu, jsem začal pozorovat podivný response_code v logech, konkrétně — 0. V logech to vypadá asi takto:
{
"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": ""
}
Čtení dokumentace a hledání na toto téma mi nepřineslo vůbec nic, protože se tvrdí, že takové chování nastává, když klient uzavře spojení, aniž by předal hlavičky. A různé exotičnosti ohledně velikosti bufferu pro wsgi_, což v našem případě vůbec nevyhovovalo.
Obecně jsme dospěli k závěru, že problém není problém, s přihlédnutím k tomu, že při našich objemech to vůbec není kritické.
Přesně do okamžiku, kdy mi byla předložena další záhada: v některých případech se odkazy bez problémů otevírají přes http, ale zcela odmítají fungovat přes https, vydávají nádherné: Connection #0 to host example.com left intact
curl: (52) Prázdná odpověď ze serveru
V logech jsem tuto věc mohl sledovat pouze podle IP – žádný request, ani žádná jiná data, jak je vidět z příkladu výše, nejsou. Jen zmíněný status 0, ale já přece vím, že jsem požadavek nepřerušil! Začal jsem zkoumat, co se může pokazit. A všechno to bylo velmi jednoduché:
listen 443 ssl http2 backlog=8192;
Takže pokud použijete http2 pro ssl-připojení, nestačí jen konfigurovat buffery požadavků, musíte je nakonfigurovat také v ngx_http_v2_module, a sice:
Syntax: http2_max_field_size velikost;
Výchozí: http2_max_field_size 4k;
Kontext: http, server
Omezuje maximální velikost hlavičky požadavku, zkomprimované pomocí HPACK. Omezení platí rovněž pro jméno i hodnotu. Pokud je aplikováno Huffmanovo kódování, skutečná velikost rozbalených řetězců jména a hodnoty může být větší. Výchozí omezení vyhovuje většině požadavků.
V podstatě, to je ono. A proč? Protože délka odkazu byla velká — větší než oněch 4k.
Nastavením na například 8kb (nebo tolik, kolik určitě stačí) problém vyřešíme.
Tak to je.
Zdroj: habr.com
