[Nginx] Kako odpraviti response_status = 0

Članek iz kategorije “stranske opombe”.

TL: DR:

http2_max_field_size 8k; # всех спасет!

Pri enem od projektov sem po spremembi neke notranje logike ozadja v dnevnikih začel opazovati čudno response_code, in sicer 0. V dnevnikih je videti nekako takole:

{
  "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": ""
}


Branje dokumentacije in googlanje na to temo ni prineslo čisto nič - ker ... Navedeno je, da se to vedenje pojavi, ko odjemalec zapre povezavo, ne da bi posredoval glave. No, in različne eksotične stvari z velikostjo medpomnilnika za wsgi_, ki v našem primeru ni ustrezala besedi "na noben način".

Na splošno smo se odločili, da težava ni težava, ob upoštevanju dejstva, da pri naših količinah sploh ni kritična.

Točno dokler me ni zmedla naslednja težava: v nekaterih primerih se povezave odprejo brez težav prek http, vendar popolnoma zavrnejo delovanje prek https, kar povzroči čudovito: povezava št. 0 do gostitelja example.com ostane nedotaknjena
curl: (52) Prazen odgovor strežnika

V logih smo to stvar lahko zasledili samo po IP - ni bilo nobene zahteve ali kakršnih koli drugih podatkov, kot je razvidno iz zgornjega primera. Samo razvpiti status je 0, vendar vem, da nisem prekinil zahteve! Začel sem ugotavljati, kaj bi lahko šlo narobe. In vse se je izkazalo za zelo preprosto:

poslušaj 443 ssl http2 zaostanek=8192;

No, če uporabljate http2 za ssl povezave, potem ni dovolj samo konfigurirati medpomnilnike zahtev, konfigurirati jih je treba tudi v ngx_http_v2_module, in sicer:

Синтаксис:	http2_max_field_size размер;
Умолчание:	http2_max_field_size 4k;
Контекст:	http, server

Omejuje največjo velikost glave zahteve, stisnjene s HPACK. Omejitev velja enako za ime in vrednost. Če je uporabljeno Huffmanovo kodiranje, je lahko dejanska velikost razpakiranih nizov imena in vrednosti večja. Privzeta omejitev je primerna za večino poizvedb.

Na splošno je to to. In zakaj vse? Ker je bila dolžina povezave dolga - daljša od teh istih 4k.

Če ga nastavimo na npr. 8kb (oz. kolikor bo verjetno dovolj), rešimo problem.
Takšne stvari.

Vir: www.habr.com

Dodaj komentar