[Nginx] Kako prevladati response_status = 0

Članak iz serije „beleške na marginama“.

TL:DR:

http2_max_field_size 8k; # sve će spasiti!

Na jednom od projekata, nakon promene neke unutrašnje logike backend-a, počeo sam primećivati čudan response_code u logovima, a to je - 0. U logovima izgleda otprilike ovako:

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


Čitanje dokumentacije i googlanje na ovu temu nije donelo konkretne rezultate - jer se tvrdi da se ovakvo ponašanje javlja kada klijent zatvori vezu ne prenoseći zaglavlja. Pa i razna egzotika sa veličinom bafera za wsgi_, što u našem slučaju nikako nije odgovaralo.

U suštini, odlučili smo da problem nije problem, s obzirom na to da na našim obimima to uopšte nije kritično.

Sve do trenutka kada su me suočili sa sledećim problemom: u nekim slučajevima linkovi se bez problema otvaraju preko http, ali potpuno odbijaju raditi preko https, dajući divno: Connection #0 to host example.com left intact
curl: (52) Prazan odgovor od servera

U logovima je ovu stvar bilo moguće pratiti samo po IP-u - ni rekvesta, ni drugih podataka, kao što se može videti iz gornjeg primera - nema. Samo onaj prokleti status 0, ali ja znam da nisam prekinuo zahtev! Počeo sam da kopam šta bi moglo da pođe naopako. A sve se ispostavilo vrlo jednostavno:

listen 443 ssl http2 backlog=8192;

Elem, ako koristite http2 za ssl-veze, nije dovoljno samo konfigurirati bafer zahteva, treba ih konfigurirati i u ngx_http_v2_module, a to jest:

Sintaksa:	http2_max_field_size veličina;
Podrazumevano:	http2_max_field_size 4k;
Kontekst:	http, server

Ograničava maksimalnu veličinu zaglavlja zahteva komprimovanog pomoću HPACK-a. Ograničenje se primenjuje jednako na ime i na vrednost. Ako se koristi Huffmanovo kodiranje, stvarna veličina raskompovanih stringova imena i vrednosti može biti veća. Podrazumevano ograničenje odgovara većini zahteva.

U suštini, to je to. A sve zbog čega? Zato što je dužina linka bila velika - veća od tih 4k.

Povećanjem na, recimo, 8kb (ili onoliko koliko je sigurno dovoljno) - rešavamo problem.
To su stvari.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster