[Nginx] نحوه شکست answer_status = 0

مقاله ای از دسته «نقشه های جانبی».

TL: DR:

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

در یکی از پروژه ها، پس از تغییر برخی منطق داخلی باطن، شروع به مشاهده یک answer_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 خودداری می کنند و شگفت انگیز را ایجاد می کنند: اتصال شماره 0 به میزبان example.com دست نخورده باقی مانده است.
curl: (52) پاسخ خالی از سرور

در گزارش‌ها، ما توانستیم این مورد را فقط با IP ردیابی کنیم - همانطور که از مثال بالا مشاهده می‌شود، هیچ درخواست یا داده دیگری وجود نداشت. فقط وضعیت بدنام 0 است، اما می دانم که درخواست را قطع نکردم! شروع کردم به کشف اینکه چه چیزی ممکن است اشتباه باشد. و همه چیز بسیار ساده بود:

گوش کن 443 ssl http2 عقب ماندگی=8192;

خوب، اگر از http2 برای اتصالات ssl استفاده می کنید، تنها پیکربندی بافرهای درخواست کافی نیست، آنها باید در ngx_http_v2_module نیز پیکربندی شوند، یعنی:

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

حداکثر اندازه هدر درخواست فشرده شده با استفاده از HPACK را محدود می کند. محدودیت به طور یکسان برای نام و مقدار اعمال می شود. اگر از رمزگذاری هافمن استفاده شود، اندازه واقعی نام و رشته های مقدار بسته بندی نشده ممکن است بزرگتر باشد. محدودیت پیش فرض برای اکثر پرس و جوها مناسب است.

به طور کلی، این است. و چرا همه؟ زیرا طول پیوند طولانی بود - بیشتر از همان 4k.

با تنظیم آن به عنوان مثال 8 کیلوبایت (یا به اندازه ای که احتمال می رود کافی باشد) مشکل را حل می کنیم.
بنابراین می رود.

منبع: www.habr.com

اضافه کردن نظر