[Nginx] Kaip nugalėti response_status = 0

Straipsnis iš kategorijos „šalutinės pastabos“.

TL: DR:

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

Viename iš projektų, pakeitęs vidinę backend logiką, žurnaluose pradėjau stebėti keistą atsako_kodą, būtent 0. Žurnaluose jis atrodo maždaug taip:

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


Perskaičius dokumentaciją ir googlinant šia tema visiškai nieko nepavyko – nes... Teigiama, kad toks elgesys įvyksta, kai klientas uždaro ryšį nepraduodamas antraščių. Na, ir įvairūs egzotiški dalykai su buferio dydžiu, skirtu wsgi_, kurie mūsų atveju netiko žodžiui „jokiu būdu“.

Apskritai, mes nusprendėme, kad problema nėra problema, atsižvelgdami į tai, kad mūsų apimtis ji nėra labai svarbi.

Tiksliai tol, kol nesugluminau dėl šios problemos: kai kuriais atvejais nuorodos atsidaro be problemų per http, bet visiškai atsisako veikti per https, sukuriant nuostabų: 0 ryšys su priegloba example.com liko nepakitęs.
curl: (52) Tuščias atsakymas iš serverio

Žurnaluose šį dalyką galėjome sekti tik pagal IP – nebuvo nei užklausos, nei kitų duomenų, kaip matyti iš aukščiau esančio pavyzdžio. Tik liūdnai pagarsėjęs statusas yra 0, bet žinau, kad nepertraukiau užklausos! Pradėjau mąstyti, kas gali nutikti. Ir viskas pasirodė labai paprasta:

klausyk 443 ssl http2 atsilikimas=8192;

Na, jei ssl ryšiams naudojate http2, neužtenka vien sukonfigūruoti užklausų buferius, jie taip pat turi būti sukonfigūruoti ngx_http_v2_module, būtent:

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

Apriboja maksimalų užklausos antraštės, suglaudintos naudojant HPACK, dydį. Apribojimas vienodai taikomas ir pavadinimui, ir vertei. Jei naudojama Huffman koduotė, tikrasis išpakuotų pavadinimo ir reikšmių eilučių dydis gali būti didesnis. Numatytoji riba tinka daugeliui užklausų.

Apskritai tai yra. Ir kodėl viskas? Nes nuorodos ilgis buvo ilgas – ilgesnis nei tie patys 4k.

Nustatę jį, pavyzdžiui, 8 kb (arba tiek, kiek tikėtina, kad užteks), problemą išsprendžiame.
Tokie atvejai.

Šaltinis: www.habr.com

Добавить комментарий