[Nginx] cavab_status = 0-ı necə məğlub etmək olar

“Yedi qeydlər” kateqoriyasından məqalə.

TL: DR:

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

Layihələrdən birində, backendin bəzi daxili məntiqini dəyişdikdən sonra loglarda qəribə cavab_kodu, yəni 0 müşahidə etməyə başladım. Jurnallarda bu belə görünür:

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


Bu mövzuda sənədləri oxumaq və axtarış aparmaq heç bir nəticə vermədi - çünki... Bildirilir ki, bu davranış müştəri başlıqları keçmədən əlaqəni bağladıqda baş verir. Yaxşı, wsgi_ üçün bufer ölçüsü olan müxtəlif ekzotik şeylər, bizim vəziyyətimizdə "heç bir şəkildə" sözünə uyğun gəlmir.

Ümumiyyətlə, bizim həcmlərimizdə bunun heç də kritik olmadığını nəzərə alaraq problemin problem olmadığına qərar verdik.

Məhz bu problem məni çaşdırana qədər: bəzi hallarda linklər http vasitəsilə problemsiz açılır, lakin https vasitəsilə işləməkdən tamamilə imtina edir və gözəldir: example.com hostuna qoşulma №0 toxunulmaz qalır.
curl: (52) Serverdən boş cavab

Qeydlərdə biz bu şeyi yalnız IP ilə izləyə bildik - yuxarıdakı nümunədən göründüyü kimi heç bir sorğu və ya başqa məlumat yox idi. Yalnız bədnam status 0-dır, amma bilirəm ki, sorğunu kəsməmişəm! Nəyin səhv ola biləcəyini anlamağa başladım. Və hər şey çox sadə oldu:

443 ssl dinlə http2 geriləmə = 8192;

Yaxşı, əgər siz ssl bağlantıları üçün http2 istifadə edirsinizsə, onda sadəcə sorğu buferlərini konfiqurasiya etmək kifayət deyil, onlar da ngx_http_v2_module-də konfiqurasiya edilməlidir, yəni:

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

HPACK istifadə edərək sıxılmış sorğu başlığının maksimum ölçüsünü məhdudlaşdırır. Məhdudiyyət həm ada, həm də dəyərə bərabər tətbiq edilir. Huffman kodlaşdırmasından istifadə edilərsə, paketdən çıxarılan ad və dəyər sətirlərinin faktiki ölçüsü daha böyük ola bilər. Defolt limit əksər sorğular üçün uyğundur.

Ümumiyyətlə, budur. Və niyə hamısı? Çünki linkin uzunluğu uzun idi - həmin 4k-dan daha uzun idi.

Onu, məsələn, 8kb (və ya kifayət qədər çox) olaraq təyin etməklə, problemi həll edirik.
Beləliklə, gedir.

Mənbə: www.habr.com

Добавить комментарий