[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) Празен отговор от сървъра

В логовете успях да проследя тази работа само по 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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster