[Nginx] Hogyan lehet legyőzni a response_status = 0 értéket

Egy cikk a „mellékjegyzetek” kategóriájából.

TL: DR:

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

Az egyik projektnél a háttérrendszer belső logikájának megváltoztatása után furcsa válaszkódot kezdtem megfigyelni a naplókban, nevezetesen 0-t. A naplókban ez valahogy így néz ki:

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


A dokumentáció elolvasása és a témában való guglizás nem hozott semmit - mert... Ez a viselkedés akkor fordul elő, ha az ügyfél a fejlécek átadása nélkül zárta le a kapcsolatot. Nos, és különféle egzotikus dolgok wsgi_ puffermérettel, ami esetünkben nem illett a „semmilyen módon” szóhoz.

Általában úgy döntöttünk, hogy a probléma nem probléma, figyelembe véve azt a tényt, hogy a mi mennyiségünknél egyáltalán nem kritikus.

Egészen pontosan addig, amíg el nem ért a fejem a következő probléma előtt: bizonyos esetekben a linkek probléma nélkül megnyílnak a http-n keresztül, de teljesen megtagadják a https-en keresztüli működést, így a csodálatos: A 0. számú kapcsolat az example.com tárhellyel sértetlenül marad
curl: (52) Üres válasz a szervertől

A naplókban ezt a dolgot csak IP alapján tudtuk nyomon követni - se kérés, se egyéb adat nem volt, ahogy az a fenti példából is látszik. Csak a hírhedt állapot 0, de tudom, hogy nem szakítottam félbe a kérést! Elkezdtem kitalálni, hogy mi lehet a baj. És minden nagyon egyszerűnek bizonyult:

hallgatni 443 ssl http2 hátralék=8192;

Nos, ha a http2-t használod az ssl kapcsolatokhoz, akkor nem elég csak a kérési puffereket beállítani, azokat az ngx_http_v2_module-ban is be kell állítani, nevezetesen:

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

Korlátozza a HPACK használatával tömörített kérésfejléc maximális méretét. A megszorítás a névre és az értékre egyaránt vonatkozik. Ha Huffman-kódolást használunk, a kicsomagolt név- és értékkarakterláncok tényleges mérete nagyobb lehet. Az alapértelmezett korlát a legtöbb lekérdezéshez megfelelő.

Általában ez az. És miért mind? Mivel a link hossza hosszú volt – hosszabb, mint ugyanez a 4k.

Ha például 8 kb-ra állítjuk (vagy annyit, amennyire valószínűleg elegendő), akkor megoldjuk a problémát.
Ilyen dolgok.

Forrás: will.com

Hozzászólás