[Nginx] Як перамагчы response_status = 0

Артыкул з разраду «нататкі на палях».

TL: DR:

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

На адным з праектаў, пасля змены некаторай унутранай логікі бэкенда, пачаў назіраць дзіўны response_code у логах, а менавіта - 0. У логах выглядае прыкладна так:

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


Чытанне дакументацыі і гугленне на дадзеную тэму дало роўным рахункам нічога - т.к. сцвярджаецца, што такія паводзіны ўзнікае, калі кліент зачыніў злучэнне не перадаўшы загалоўкі. Ну і розная экзотыка з памерам буфера для wsgi_, што ў нашым выпадку не падыходзіла ад слова "ніяк".

У цэлым, вырашылі, што праблема - не праблема, з улікам таго, што на нашых аб'ёмах яно зусім не крытычна.

Роўна да таго моманту, пакуль мяне не збянтэжылі наступнай праблемай: у некаторых выпадках спасылкі без праблем адчыняюцца па http, але зусім адмаўляюцца працаваць па https, выдаючы цудоўнае: Connection #0 to host example.com left intact
curl: (52) Empty reply from server

У логах адсачыць гэтую штуку атрымалася толькі па IP – ні рэквеста, ні якія-небудзь іншых дадзеных, як відаць з прыкладу вышэй – не. Толькі праславуты статус 0, але я ведаю, што запыт я не перарываў! Пачаў калупаць, што ж можа пайсці не так. А ўсё аказалася вельмі проста:

слухаць 443 SSL http2 backlog=8192;

Ну дык вось - калі выкарыстоўваць http2 для ssl-злучэнняў, то недастаткова проста канфігураваць буферы запыту, канфігураваць іх трэба і ў ngx_http_v2_module, а менавіта:

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

Абмяжоўвае максімальны памер загалоўка запыту, сціснутага пры дапамозе HPACK. Абмежаванне прымяняецца ў роўнай ступені як да імя, так і да значэння. Калі ўжываецца кадаваньне Хафмана, то фактычны памер распакаваных радкоў імя і значэння можа быць больш. Абмежаванне па змаўчанні падыходзіць для большасці запытаў.

Увогуле, гэта яно. А ўсё чаму? Таму што даўжыня спасылкі была вялікай – больш, чым тыя самыя 4k.

Выставіўшы яго ў, напрыклад, 8kb (ці гэтулькі, колькі напэўна хопіць) – развязальны праблему.
Такія справы.

Крыніца: habr.com

Дадаць каментар