Článek z kategorie „sidenotes“.
TL: DR:
http2_max_field_size 8k; # всех спасет!
Na jednom z projektů jsem po změně nějaké vnitřní logiky backendu začal v logech pozorovat podivný response_code, 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 googlování na toto téma nepřineslo absolutně nic - protože... Je uvedeno, že k tomuto chování dochází, když klient ukončil připojení bez předání hlaviček. No a různé exotické věci s velikostí bufferu pro wsgi_, které se v našem případě ke slovu „v žádném případě nehodily“.
Obecně jsme se rozhodli, že problém není problém, s ohledem na skutečnost, že v našich objemech to není vůbec kritické.
Přesně do té doby, než jsem byl zmaten následujícím problémem: v některých případech se odkazy otevírají bez problémů přes http, ale úplně odmítají fungovat přes https, což vede k úžasnému: Připojení #0 k hostiteli example.com zůstalo nedotčené
curl: (52) Prázdná odpověď ze serveru
V logech jsme tuto věc mohli sledovat pouze podle IP - nebyl tam žádný požadavek ani žádná jiná data, jak je vidět z příkladu výše. Pouze notoricky známý stav je 0, ale vím, že jsem požadavek nepřerušil! Začal jsem zjišťovat, co se může pokazit. A vše se ukázalo být velmi jednoduché:
poslouchat 443 ssl http2 nevyřízených = 8192;
Pokud používáte http2 pro připojení ssl, pak nestačí pouze nakonfigurovat buffery požadavků, musí být také nakonfigurovány v ngx_http_v2_module, konkrétně:
Синтаксис: http2_max_field_size размер;
Умолчание: http2_max_field_size 4k;
Контекст: http, server
Omezuje maximální velikost hlavičky požadavku komprimované pomocí HPACK. Omezení platí stejně pro název i hodnotu. Pokud je použito Huffmanovo kódování, může být skutečná velikost rozbalených řetězců jmen a hodnot větší. Výchozí limit je vhodný pro většinu dotazů.
Obecně platí, že je to ono. A proč všechny? Protože délka odkazu byla dlouhá - delší než stejná 4k.
Nastavením například na 8 kb (nebo tolik, kolik pravděpodobně bude stačit), problém vyřešíme.
Takové věci.
Zdroj: www.habr.com