[Nginx] Sut i drechu response_status = 0

Erthygl o'r categori β€œsidenotes”.

TL: DR:

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

Ar un o'r prosiectau, ar Γ΄l newid rhywfaint o resymeg fewnol y backend, dechreuais arsylwi cod ymateb rhyfedd yn y logiau, sef 0. Yn y logiau mae'n edrych rhywbeth fel hyn:

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


Ni roddodd darllen y ddogfennaeth a googling ar y pwnc hwn ddim byd o gwbl - oherwydd ... Dywedir bod yr ymddygiad hwn yn digwydd pan gaeodd y cleient y cysylltiad heb basio'r penawdau. Wel, ac amryw o bethau egsotig gyda'r maint byffer ar gyfer wsgi_, nad oedd yn ein hachos ni yn cyd-fynd Γ’'r gair β€œmewn unrhyw ffordd”.

Yn gyffredinol, penderfynasom nad yw'r broblem yn broblem, gan ystyried y ffaith nad yw'n hollbwysig o gwbl yn ein cyfrolau.

Yn union nes i mi gael fy syfrdanu gan y broblem ganlynol: mewn rhai achosion, mae dolenni'n agor heb broblemau trwy http, ond yn gwrthod yn llwyr weithio trwy https, gan gynhyrchu'r gwych: Cysylltiad #0 i westeiwr example.com wedi'i adael yn gyfan
curl: (52) Ateb gwag gan y gweinydd

Yn y logiau, dim ond trwy IP yr oeddem yn gallu olrhain y peth hwn - nid oedd unrhyw gais nac unrhyw ddata arall, fel y gwelir o'r enghraifft uchod. Dim ond y statws drwg-enwog yw 0, ond gwn na wnes i dorri ar draws y cais! Dechreuais ddarganfod beth allai fynd o'i le. Ac fe drodd popeth yn syml iawn:

gwrandewch 443 ssl http2 Γ΄l-groniad=8192;

Wel, os ydych chi'n defnyddio http2 ar gyfer cysylltiadau ssl, yna nid yw'n ddigon dim ond i ffurfweddu'r byfferau cais, rhaid iddynt hefyd gael eu ffurfweddu yn ngx_http_v2_module, sef:

Бинтаксис:	http2_max_field_size Ρ€Π°Π·ΠΌΠ΅Ρ€;
Π£ΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΠ΅:	http2_max_field_size 4k;
ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚:	http, server

Yn cyfyngu ar uchafswm maint pennawd cais wedi'i gywasgu gan ddefnyddio HPACK. Mae'r cyfyngiad yr un mor berthnasol i'r enw a'r gwerth. Os defnyddir amgodio Huffman, efallai y bydd maint gwirioneddol yr enw heb ei bacio a'r llinynnau gwerth yn fwy. Mae'r terfyn rhagosodedig yn addas ar gyfer y rhan fwyaf o ymholiadau.

Yn gyffredinol, dyma fe. A pham i gyd? Oherwydd bod hyd y ddolen yn hir - yn hirach na'r rhai yr un 4k.

Trwy ei osod i, er enghraifft, 8kb (neu gymaint ag sy'n debygol o fod yn ddigon), rydym yn datrys y broblem.
Felly mae'n mynd.

Ffynhonnell: hab.com

Ychwanegu sylw