[Nginx] Jak porazit response_status = 0

Č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

Přidat komentář