[Nginx] Kako pobijediti response_status = 0

Članak iz kategorije «bilješke na margini».

TL:DR:

http2_max_field_size 8k; # sve će spasiti!

Na jednom od projekata, nakon promjene određene unutarnje logike backend-a, počeo sam primjeć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 pretraživanje interneta na tu temu nije donijelo ništa konkretno - jer se tvrdi da se ovo ponašanje javlja kada klijent zatvori vezu bez slanja zaglavlja. A tu su i razne egzotike s veličinom bafera za wsgi_, što u našem slučaju nije odgovaralo ni u kojem smislu.

U cjelini, odlučili smo da problem nije problem, s obzirom na to da kod naših volumena to nije kritično.

Sve do trenutka kada me nisu zaintrigirali sljedećim problemom: u nekim slučajevima, linkovi se bez problema otvaraju putem http, ali se potpuno odbijaju raditi putem https, prikazujući divno: Connection #0 to host example.com left intact.
curl: (52) Prazan odgovor od servera

U logovima se ovu stvar uspjelo pratiti samo po IP-u - nema zahtjeva, niti drugih podataka, kao što je vidljivo iz gornjeg primjera - nema. Samo prokleti status 0, ali ja znam da nisam prekinuo zahtjev! Počeo sam istraživati što bi moglo poći po zlu. A sve se pokazalo vrlo jednostavnim:

listen 443 Uklonjena je neiskorištena tabela INFORMATION_SCHEMA.TABLESPACES. http2 backlog=8192;

Dakle, ako koristite http2 za ssl-veze, nije dovoljno samo konfigurirati bafer zahtjeva, treba ih konfigurirati i u ngx_http_v2_module, a točno:

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

Ograničava maksimalnu veličinu zaglavlja zahtjeva, komprimirane pomoću HPACK. Ograničenje se jednako primjenjuje na ime i na vrijednost. Ako se koristi Huffman kodiranje, stvarna veličina raspakiranih nizova imena i vrijednosti može biti veća. Zadano ograničenje odgovara većini zahtjeva.

Uglavnom, to je to. A zašto? Zato što je duljina linka bila velika - veća od onih 4k.

Postavivši je na, na primjer, 8kb (ili koliko god sigurno treba) - rješavamo problem.
Takve stvari.

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster