[Nginx] Kā pārspēt atbildes_statuss = 0

Raksts no kategorijas “blakus piezīmes”.

TL: DR:

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

Vienā no projektiem, mainot aizmugursistēmas iekšējo loģiku, es sāku novērot dīvainu atbildes_kodu žurnālos, proti, 0. Žurnālos tas izskatās apmēram šādi:

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


Dokumentācijas lasīšana un googlēšana par šo tēmu nedeva absolūti neko - jo... Tiek norādīts, ka šāda rīcība notiek, kad klients aizvēra savienojumu, nenododot galvenes. Nu un dažādas eksotiskas lietas ar bufera izmēru priekš wsgi_, kas mūsu gadījumā nederēja vārdam “nekādā veidā”.

Kopumā nolēmām, ka problēma nav problēma, ņemot vērā to, ka pie mūsu apjomiem tā nebūt nav kritiska.

Tieši līdz brīdim, kad mani mulsināja šāda problēma: dažos gadījumos saites tiek atvērtas bez problēmām, izmantojot http, bet pilnībā atsakās darboties, izmantojot https, radot brīnišķīgo: savienojums Nr. 0 ar vietni example.com paliek neskarts.
curl: (52) Tukša atbilde no servera

Žurnālos mēs varējām izsekot šai lietai tikai pēc IP — nebija ne pieprasījuma, ne citu datu, kā redzams no iepriekš minētā piemēra. Tikai bēdīgi slavenais statuss ir 0, bet es zinu, ka es nepārtraucu pieprasījumu! Es sāku izdomāt, kas varētu noiet greizi. Un viss izrādījās ļoti vienkārši:

klausīties 443 ssl http2 atlikums=8192;

Nu, ja ssl savienojumiem izmantojat http2, tad nepietiek tikai ar pieprasījuma buferu konfigurēšanu, tie ir jākonfigurē arī ngx_http_v2_module, proti:

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

Ierobežo pieprasījuma galvenes maksimālo izmēru, kas saspiests, izmantojot HPACK. Ierobežojums vienlīdz attiecas gan uz nosaukumu, gan uz vērtību. Ja tiek izmantots Hafmena kodējums, izpakotā nosaukuma un vērtību virkņu faktiskais lielums var būt lielāks. Noklusējuma ierobežojums ir piemērots lielākajai daļai vaicājumu.

Kopumā tas ir tas. Un kāpēc viss? Jo saites garums bija garš - garāks par tiem pašiem 4k.

Iestatot to, piemēram, 8kb (vai tik daudz, cik, visticamāk, pietiks), mēs atrisinām problēmu.
Šādas lietas.

Avots: www.habr.com

Pievieno komentāru