Артыкул з разраду «нататкі на палях».
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