[Nginx] Ako prekonať response_status = 0

Článok z kategórie „poznámky na okraji“.

TL:DR:

http2_max_field_size 8k; # všetkých zachráni!

Na jednom z projektov, po zmene určitej vnútornej logiky backendu, som začal pozorovať zvláštny response_code v logoch, a to konkrétne — 0. V logoch to vyzerá približne 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": ""
}


Čítanie dokumentácie a googlenie na túto tému dalo presne nič — pretože sa uvádza, že takéto správanie nastáva, keď klient uzavrie spojenie a neodošle hlavičky. No a rôzne exotiky s veľkosťou buffera pre wsgi_, čo v našom prípade vôbec nesedelo.

Celkově jsme sa rozhodli, že problém nie je problém, s ohľadom na to, že pri našich objemoch to vôbec nie je kritické.

Presne do okamihu, kým ma neznepokojila ďalšia otázka: v niektorých prípadoch sa odkazy bez problémov otvárajú cez http, ale úplne odmietajú fungovať cez https, vydávajúce zázračné: Connection #0 to host example.com left intact
curl: (52) Prázdna odpoveď zo servera

V logoch sa mi podarilo vystopovať túto vec len podľa IP — ani požiadavka, ani žiadne iné údaje, ako je vidieť z vyššie uvedeného príkladu — nie sú. Iba preslávený status 0, ale ja viem, že som požiadavku neprerušil! Začal som skúmať, čo sa môže pokaziť. A všetko sa ukázalo byť veľmi jednoduché:

listen 443 ssl http2 backlog=8192;

No tak — ak sa používa http2 pre ssl-pripojenia, nestačí len konfigurovať buffery požiadavky, treba ich konfigurovať aj v ngx_http_v2_module, a to konkrétne:

Syntax:	http2_max_field_size veľkosť;
Predvolené:	http2_max_field_size 4k;
Kontext:	http, server

Obmedzuje maximálnu veľkosť hlavičky požiadavky, komprimovanej pomocou HPACK. Obmedzenie sa uplatňuje rovnako na názov, ako aj na hodnotu. Ak sa používa Huffmanovo kódovanie, skutočná veľkosť dekomprimovaných reťazcov názvu a hodnoty môže byť väčšia. Predvolené obmedzenie vyhovuje väčšine požiadaviek.

V podstate to je ono. A prečo? Pretože dĺžka odkazu bola veľká — väčšia, ako tých preslávených 4k.

Nastavením na napríklad 8kb (alebo toľko, koľko určite stačí) — vyriešime problém.
Tak to je.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster