[nginx] كيفية التغلب على response_status = 0

مقال من فئة "الملاحظات الهامشية".

TL: DR:

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

في أحد المشاريع ، بعد تغيير بعض منطق الواجهة الخلفية الداخلية ، بدأت في ملاحظة رمز استجابة غريب في السجلات ، وهو 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": ""
}


قراءة الوثائق والبحث في Google حول هذا الموضوع لم يعطِ شيئًا على الإطلاق - لأن. ويقال أن هذا السلوك يحدث عندما أغلق العميل الاتصال دون إرسال الرؤوس. حسنًا ، أنواع غريبة مختلفة بحجم المخزن المؤقت لـ wsgi_ ، والتي في حالتنا لم تتناسب مع كلمة "بأي حال من الأحوال".

بشكل عام ، قررنا أن المشكلة ليست مشكلة ، نظرًا لأنها ليست حرجة على الإطلاق في مجلداتنا.

بالضبط حتى اللحظة التي شعرت فيها بالحيرة من المشكلة التالية: في بعض الحالات ، تفتح الروابط عبر http دون مشاكل ، لكن ترفض تمامًا العمل عبر https ، مما يمنحني ميزة رائعة: Connection # 0 لاستضافة example.com تركت سليمة
حليقة: (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. ينطبق القيد بالتساوي على كل من الاسم والقيمة. إذا تم استخدام ترميز Huffman ، فقد يكون الحجم الفعلي للاسم الذي تم فك حزمه وسلاسل القيمة أكبر. الحد الافتراضي مناسب لمعظم الطلبات.

بشكل عام ، هذا هو. وكل لماذا؟ لأن طول الرابط كان كبيرًا - أكثر من نفس 4K.

من خلال تعريضها ، على سبيل المثال ، إلى 8 كيلوبايت (أو بقدر ما يكفي على الأرجح) - نحل المشكلة.
مثل هذه الأشياء.

المصدر: www.habr.com

إضافة تعليق