Статия от типа «бележки на полях».
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) Празен отговор от сървъра
В логовете успях да проследя тази работа само по IP — нито request, нито каквито и да било други данни, каквито се виждат от примера по-горе — няма. Само пресловутият статус 0, но аз знам, че не съм прекратявал заявката! Започнах да разглеждам, какво може да не е наред. А всъщност всичко се оказа доста просто:
listen 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
