[Nginx] Jak překonat response_status = 0

Č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

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster