[Nginx] Paano talunin ang response_status = 0

Isang artikulo mula sa kategorya ng "sidenotes".

TL: DR:

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

Sa isa sa mga proyekto, pagkatapos na baguhin ang ilang panloob na lohika ng backend, sinimulan kong obserbahan ang isang kakaibang response_code sa mga log, katulad ng 0. Sa mga log ay ganito ang hitsura:

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


Ang pagbabasa ng dokumentasyon at pag-googling sa paksang ito ay talagang walang resulta - dahil... Nakasaad na ang pag-uugaling ito ay nangyayari kapag isinara ng kliyente ang koneksyon nang hindi ipinapasa ang mga header. Well, at iba't ibang mga kakaibang bagay na may laki ng buffer para sa wsgi_, na sa aming kaso ay hindi magkasya sa salitang "sa anumang paraan".

Sa pangkalahatan, napagpasyahan namin na ang problema ay hindi isang problema, isinasaalang-alang ang katotohanan na sa aming mga volume ay hindi ito kritikal.

Eksakto hanggang sa ako ay nalilito sa sumusunod na problema: sa ilang mga kaso, ang mga link ay bumubukas nang walang mga problema sa pamamagitan ng http, ngunit ganap na tumanggi na gumana sa pamamagitan ng https, na gumagawa ng kahanga-hangang: Koneksyon #0 upang mag-host ng example.com ay naiwang buo
curl: (52) Walang laman na tugon mula sa server

Sa mga log, nagawa naming subaybayan ang bagay na ito sa pamamagitan lamang ng IP - walang kahilingan o anumang iba pang data, tulad ng makikita mula sa halimbawa sa itaas. Tanging ang kilalang-kilala na katayuan ay 0, ngunit alam ko na hindi ko nagambala ang kahilingan! Sinimulan kong malaman kung ano ang maaaring magkamali. At ang lahat ay naging napaka-simple:

makinig sa 443 ssl http2 backlog=8192;

Buweno, kung gumagamit ka ng http2 para sa mga koneksyon sa ssl, kung gayon hindi sapat na i-configure lamang ang mga buffer ng kahilingan, dapat din silang mai-configure sa ngx_http_v2_module, katulad:

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

Nililimitahan ang maximum na laki ng header ng kahilingan na na-compress gamit ang HPACK. Nalalapat ang pagpilit sa parehong pangalan at halaga. Kung gagamitin ang pag-encode ng Huffman, maaaring mas malaki ang aktwal na laki ng hindi naka-pack na pangalan at mga string ng halaga. Ang default na limitasyon ay angkop para sa karamihan ng mga query.

Sa pangkalahatan, ito na. At bakit lahat? Dahil ang haba ng link ay mahaba - mas mahaba kaysa sa parehong 4k.

Sa pamamagitan ng pagtatakda nito sa, halimbawa, 8kb (o hangga't malamang na sapat), nalutas namin ang problema.
Ang mga ganitong bagay.

Pinagmulan: www.habr.com

Magdagdag ng komento