502 مدخل غير صالح - OverBigLine

أنت الآن بصدد الاطّلاع على مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
info

المشكلة

يتلقّى تطبيق العميل رمز حالة HTTP 502 Bad Gateway مع رمز الخطأ protocol.http.TooBigLine كردّ على طلبات البيانات من واجهة برمجة التطبيقات.

رسالة الخطأ

يتلقّى تطبيق العميل رمز الاستجابة التالي:

HTTP/1.1 502 Bad Gateway

بالإضافة إلى ذلك، قد تظهر لك رسالة الخطأ التالية:

{
   "fault":{
      "faultstring":"response line size exceeding 2,048",
      "detail":{
         "errorcode":"protocol.http.TooBigLine"
      }
   }
}

الأسباب المحتملة

يحدث هذا الخطأ إذا كان حجم Response-Line الذي أرسله الخادم المستهدف/الخادم الخلفي إلى Apigee Edge كجزء من استجابة HTTP أكبر من الحد الأقصى المسموح به في Apigee Edge.

قبل أن نلقي نظرة على الأسباب المحتملة لهذا الخطأ، دعونا نفهم معنى Response-Line وكيفية التحقّق من حجمه.

التعرّف على Response-Line

تتألف استجابة HTTP النموذجية من ثلاثة أجزاء:

  1. Status-Line (يُشار إليها باسم Response-Line في Apigee)
  2. ( مجموعة من عناوين HTTP )
  3. [ Body ]

يتألف سطر الاستجابة من ثلاثة أجزاء: إصدار البروتوكول يليه رمز حالة رقمي وعبارة نصية مرتبطة كما هو موضّح أدناه:

Response-Line   = <HTTP-Version> <Status-Code> <Reason-Phrase>

عندما يرسل تطبيق الخادم المستهدف/الخلفي استجابة HTTP، يمثّل السطر الأول الذي يتم إرساله سطر الاستجابة كما هو موضّح أعلاه. يلي ذلك العناوين ونص الاستجابة/الحِمل.تعرض لقطة الشاشة النموذجية التالية طلب curl نموذجيًا، وجزء الطلب وجزء الاستجابة (بالإضافة إلى سطر الاستجابة).

فهم حجم "سطر الرد"

  1. في النموذج الذي تمت مناقشته أعلاه، يكون سطر البداية (السطر الأول) في الرد، والذي يُشار إليه أيضًا باسم Response-Line، على النحو التالي:

    HTTP/1.1 200 OK

    يبلغ حجم Response-Line هذا ~15 bytes لأنّه يحتوي على 15 ASCII characters. بما أنّ هذا الإجراء يندرج ضمن الحدّ المسموح به في Apigee Edge، يتم إرسال الردّ إلى العميل بدون أي أخطاء من Apigee Edge.

  2. وبالمثل، إذا نظرت إلى faultstring في رسالة الخطأ الموضّحة أعلاه، ستجد أنّها تحتوي على "response line size exceeding 2,048". يشير ذلك إلى أنّ Response-Line في استجابة HTTP التي أرسلها الخادم المستهدف/خادم الخلفية تجاوزت 2,048 بايت.

فهم Response-Line الكبير

وفقًا لتعريف Status-Line (المشار إليه هنا باسم Response-Line) وطلبات واستجابات HTTP النموذجية، سيكون الحجم أصغر بكثير من الحدّ التلقائي المحدّد البالغ 2 كيلوبايت في Apigee Edge، لذلك قد لا نصل إلى الحدّ. في ما يلي بعض السيناريوهات المحتملة التي قد تتجاوز فيها هذا الحدّ:

  1. الخادم المستهدف/الخلفي ليس نظام HTTP. قد تكون الاستجابة غير متوافقة مع HTTP.
  2. يواجه الخادم المستهدف/الخادم الخلفي مشاكل ويرسل Response-Line طويلاً كجزء من استجابة HTTP.

يمكنك الاطّلاع على مزيد من المعلومات حول هذا الموضوع في مقالة Getting error protocol.http.TooBigLine, "response line size exceeding 2,048.

في ما يلي الأسباب المحتملة لظهور هذا الخطأ:

السبب الوصف تعليمات تحديد المشاكل وحلّها التي تنطبق على
حجم سطر الرد أكبر من الحدّ المسموح به حجم Response-Line الذي يرسله الخادم المستهدف/خادم الخلفية كجزء من استجابة HTTP إلى Apigee Edge أكبر من الحد المسموح به في Apigee Edge مستخدمو Edge Public Cloud وEdge Private Cloud

خطوات التشخيص الشائعة

استخدِم إحدى الأدوات أو التقنيات التالية لتشخيص هذا الخطأ:

API Monitoring

لتشخيص الخطأ باستخدام "مراقبة واجهة برمجة التطبيقات"، اتّبِع الخطوات التالية:

  1. سجِّل الدخول إلى واجهة مستخدم Apigee Edge بصفتك مستخدمًا لديه دور مناسب.
  2. انتقِل إلى المؤسسة التي تريد التحقيق في المشكلة فيها.

  3. انتقِل إلى صفحة تحليل > مراقبة واجهة برمجة التطبيقات > التحقيق.
  4. اختَر الفترة الزمنية المحدّدة التي لاحظت فيها الأخطاء.
  5. يمكنك اختيار فلتر الخادم الوكيل لتضييق نطاق رمز الخطأ.
  6. رسم بياني لرمز الخطأ مقابل الوقت
  7. اختَر الخلية التي تحتوي على رمز الخطأ protocol.http.TooBigLine كما هو موضح أدناه:

    ( عرض صورة أكبر)

  8. ستظهر لك معلومات حول رمز الخطأ protocol.http.TooBigLine كما هو موضّح أدناه:

    ( عرض صورة أكبر)

  9. انقر على عرض السجلات ووسِّع صف الطلب الذي تعذّر تنفيذه.

  10. من نافذة السجلّات، سجِّل التفاصيل التالية:
    • رمز الحالة: 502
    • مصدر الخطأ: target
    • رمز الخطأ: protocol.http.TooBigLine
  11. إذا كانت قيمة مصدر الخطأ هي target وكانت قيمة رمز الخطأ هي protocol.http.TooBigLine، يشير ذلك إلى أنّ حجم سطر الاستجابة في استجابة HTTP من الخادم الخلفي/ الخادم المستهدف أكبر من الحدّ الأقصى المسموح به في Apigee Edge.

أداة التتبُّع

  1. فعِّل جلسة التتبُّع وأي مما يلي:
    1. انتظِر إلى أن يظهر الخطأ 502 Bad Gateway. أو
    2. إذا كان بإمكانك إعادة إظهار المشكلة، أجرِ طلب البيانات من واجهة برمجة التطبيقات وأعِد إظهار الخطأ 502 Bad Gateway.
  2. اختَر أحد الطلبات التي تعذّر تنفيذها وافحص التتبُّع.
  3. تنقَّل بين مراحل التتبُّع المختلفة وحدِّد مكان حدوث الخطأ.
  4. عادةً ما يظهر الخطأ في flowinfo Error بعد مرحلة إرسال الطلب إلى الخادم المستهدف مباشرةً، كما هو موضّح أدناه:

    دوِّن قيم الخطأ من التتبُّع:

    • الخطأ: response line exceeding 2,048
    • error.class: com.apigee.errors.http.server.BadGateway

    يشير ذلك إلى أنّ Apigee Edge (مكوّن "معالج الرسائل") يعرض الخطأ فور تلقّيه الردّ من خادم الخلفية بسبب تجاوز حجم سطر الردّ الحدّ المسموح به.

  5. ستظهر لك رسالة الخطأ المُرسَلة إلى العميل في مرحلة الردّ المُرسَل إلى العميل كما هو موضّح أدناه:

    ( عرض صورة أكبر)

  6. دوِّن قيم الخطأ من التتبُّع:
    • الخطأ: 502 Bad Gateway.
    • محتوى الخطأ: {"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
  7. يمكنك أيضًا الانتقال إلى مرحلة AX (تسجيل بيانات الإحصاءات) في التتبُّع والنقر عليها للاطّلاع على تفاصيل الخطأ.

    ( عرض صورة أكبر)

    لاحظ قيمة ما يلي:

    عناوين الطلبات القيمة
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target
    محتوى الخطأ : النص الأساسي {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}

NGINX

لتشخيص الخطأ باستخدام سجلّات الوصول إلى NGINX، اتّبِع الخطوات التالية:

  1. إذا كنت مستخدمًا في Private Cloud، يمكنك استخدام سجلّات الوصول إلى NGINX لتحديد المعلومات الأساسية حول أخطاء HTTP 502.
  2. تحقَّق من سجلّات الوصول إلى NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    المكان: يتم استبدال ORG وENV وPORT# بالقيم الفعلية.

  3. ابحث لمعرفة ما إذا كانت هناك أي أخطاء 502 خلال مدة زمنية معيّنة (إذا حدثت المشكلة في الماضي) أو إذا كانت هناك أي طلبات لا تزال غير ناجحة مع 502.
  4. إذا عثرت على أي أخطاء 502 تطابق قيمة X-Apigee-fault-code protocol.http.TooBigLine، حدِّد قيمة X-Apigee-fault-source.

    يحتوي إدخال النموذج أعلاه من سجلّ الوصول إلى NGINX على القيم التالية لـ X- Apigee-fault-code وX-Apigee-fault-source:

    عناوين الاستجابة القيمة
    X-Apigee-fault-code protocol.http.TooBigLine
    X-Apigee-fault-source target

السبب: حجم سطر الرد أكبر من الحدّ المسموح به

التشخيص

  1. حدِّد رمز الخطأ ومصدر الخطأ للخطأ الذي تم رصده باستخدام أداة مراقبة واجهة برمجة التطبيقات أو أداة التتبُّع أو سجلّات الوصول إلى NGINX كما هو موضّح في خطوات التشخيص الشائعة.
  2. إذا كانت قيمة مصدر الخطأ هي target، يشير ذلك إلى أنّ حجم سطر الاستجابة الذي أرسله تطبيق الخادم الخلفي/الخادم المستهدف إلى Apigee أكبر من الحدّ المسموح به في Apigee Edge.
  3. يمكنك التأكّد من أنّ حجم سطر الردّ قد تجاوز الحدّ المسموح به البالغ 2 كيلوبايت باستخدام إحدى الطريقتَين التاليتَين:

    رسالة الخطأ

    لإثبات صحة المعلومات باستخدام رسالة الخطأ، اتّبِع الخطوات التالية:

    إذا كان بإمكانك الوصول إلى رسالة الخطأ الكاملة التي تلقّيتها من Apigee Edge، يُرجى الرجوع إلى faultstring.

    نموذج رسالة الخطأ:

    "faultstring":"response line size exceeding 2,048"

    يشير الرمز faultstring أعلاه إلى أنّ حجم سطر الردّ تجاوز الحدّ المسموح به وهو 2 كيلوبايت.

    الطلب الفعلي

    لإثبات صحة الرمز باستخدام الطلب الفعلي، اتّبِع الخطوات التالية:

    إذا كان بإمكانك الوصول إلى الطلب الفعلي المقدَّم إلى تطبيق الخادم الخلفي/الهدف، اتّبِع الخطوات التالية:

    1. التحقّق من حجم Response-Line
    2. إذا تبيّن لك أنّ حجم معرّف الموارد المنتظم (URI) يتجاوز الحدّ المسموح به في Apigee Edge، فهذا هو سبب المشكلة.

      نموذج استجابة من الخادم المستهدف/الخادم الخلفي:

      curl -v http://HOSTALIAS/test
      
      *   Trying 3.2.1.4...
      * TCP_NODELAY set
      * Connected to <hostalias> (3.2.1.4) port 80 (#0)
      > GET /test HTTP/1.1
      > Host: HOSTALIAS
      > User-Agent: curl/7.64.1
      > Accept: */*
      >
      < HTTP/1.1 200 1111…<trimmed>...11111111
      < Date: Mon, 26 Jul 2021 07:07:18 GMT
      < Content-Type: application/json
      < Content-Length: 269
      < Connection: keep-alive
      < Server: gunicorn/19.9.0
      < Access-Control-Allow-Origin: *
      < Access-Control-Allow-Credentials: true
      <
      {
      <Response Body>
      }
      * Connection #0 to host <hostalias> left intact
      * Closing connection 0

      في الحالة أعلاه، يكون سطر الردّ HTTP/1.1 200 1111…<trimmed>...11111111 أكبر من 2 كيلوبايت، أي أنّه يتضمّن أكثر من 2000 حرف ASCII.

      إذا كنت تستخدم برنامجًا آخر، يمكنك مراجعة سجلّات البرنامج ومحاولة معرفة حجم سطر الرد الذي يتم إرساله إلى Apigee Edge.

    سجلّات "معالج الرسائل"

    لإثبات صحة البيانات باستخدام سجلّات "معالج الرسائل"، اتّبِع الخطوات التالية:

    إذا كنت مستخدمًا في Private Cloud، يمكنك استخدام سجلّات &quot;معالج الرسائل&quot; للتحقّق مما إذا كان حجم سطر الرد قد تجاوز الحدّ المسموح به في Apigee Edge.

    1. حدِّد معرّف الرسالة للطلب الذي تعذّر تنفيذه باستخدام "رصد واجهة برمجة التطبيقات" أو أداة "التتبُّع" أو سجلّات الوصول إلى NGINX كما هو موضّح في خطوات التشخيص الشائعة.
    2. ابحث عن معرّف الرسالة في سجلّ "معالج الرسائل" (Message Processor) باتّباع الخطوات التالية:

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. ستجد سطورًا من system.log مشابهة لما يلي:

      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1
      NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() :
      ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592
      useCount=1 bytesRead=0 bytesWritten=201 age=144ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048
      at <snipped>
      
      2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1
      messageid:r-5110240-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@6a5d6c33, response line size exceeding 2,048)

      يشير النص message = response line size exceeding 2,048 في رسالة الخطأ أعلاه إلى أنّ حجم سطر الرد يتجاوز 2 كيلوبايت. لذلك، يعرض Apigee Edge الاستثناء ويعرض رمز الحالة 502 مع رمز الخطأ protocol.http.TooBigline لتطبيقات العميل.

الدقة

تحديد الحجم

الخيار 1 [مقترَح]: إصلاح تطبيق الخادم المستهدف/الخلفي لكي لا يرسل أسطر استجابة بحجم أكبر من الحد المسموح به

  1. حلِّل سبب إرسال العميل المحدّد لسطر استجابة بحجم أكبر من الحدّ المسموح به كما هو محدّد في الحدود.
  2. إذا لم يكن ذلك مرغوبًا فيه، عدِّل تطبيق الخادم المستهدف/الخلفي بحيث يرسل سطر استجابة بحجم أقل من الحد المسموح به.
  3. إذا كان ذلك مرغوبًا وأردت إرسال سطر ردّ بحجم أكبر من الحد المسموح به، انتقِل إلى الخيارات التالية.

CwC

الخيار 2: استخدام السمة CwC لزيادة الحدّ الأقصى لعدد الأحرف في سطر الردّ

توفّر Apigee السمة CwC التي تتيح لها زيادة الحد الأقصى لحجم سطر الرد. للحصول على التفاصيل، يُرجى الاطّلاع على ضبط الحدّ الأقصى لعدد أسطر الردّ في "معالج الرسائل".

الحدود

تتوقّع Apigee ألا يرسل تطبيق العميل وخادم الخلفية أسطر طلب/ردّ تتجاوز أحجامها الحدّ المسموح به كما هو موضّح في الحدّ الأقصى لسطر الطلب/الردّ في حدود Apigee Edge.

  1. إذا كنت مستخدمًا للسحابة الإلكترونية العامة، يكون الحدّ الأقصى لحجم سطر الطلب والاستجابة هو ما هو موضّح في حجم سطر الطلب/الاستجابة ضمن حدود Apigee Edge.
  2. إذا كنت مستخدمًا في Private Cloud، فمن المحتمل أنّك عدّلت الحد الأقصى التلقائي لحجم سطر الطلب والاستجابة (على الرغم من أنّها ليست ممارسة يُنصح بها). يمكنك تحديد الحد الأقصى لحجم سطر الردّ باتّباع التعليمات الواردة في مقالة كيفية التحقّق من الحدّ الحالي.

كيف يمكن التحقّق من الحدّ الحالي؟

يوضّح هذا القسم كيفية التأكّد من تعديل السمة HTTPResponse.line.limit بقيمة جديدة في "معالجات الرسائل".

  1. على جهاز &quot;معالج الرسائل&quot;، ابحث عن السمة HTTPResponse.line.limit في الدليل /opt/apigee/edge-message-processor/conf وتحقّق من القيمة التي تم ضبطها كما هو موضّح أدناه:
    grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
    
  2. في ما يلي نموذج للنتيجة من الأمر أعلاه:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
  3. في مثال الناتج أعلاه، لاحظ أنّه تم ضبط السمة HTTPResponse.line.limit بالقيمة 2k في http.properties.

    يشير ذلك إلى أنّ الحدّ الأقصى لحجم Response-Line الذي تم ضبطه في Apigee for Private Cloud هو 2 كيلوبايت.

إذا كنت لا تزال بحاجة إلى أي مساعدة من فريق دعم Apigee، انتقِل إلى المعلومات التشخيصية التي يجب جمعها.

يجب جمع معلومات التشخيص

اجمع معلومات التشخيص التالية، ثم تواصَل مع فريق دعم Apigee Edge:

إذا كنت مستخدمًا لخدمة السحابة الإلكترونية العامة، يُرجى تقديم المعلومات التالية:

  • اسم المؤسسة
  • اسم البيئة
  • اسم خادم وكيل لواجهة برمجة التطبيقات
  • أمر curl الكامل المُستخدَم لإعادة إنتاج الخطأ 502
  • ملف التتبُّع لطلبات البيانات من واجهة برمجة التطبيقات

إذا كنت مستخدمًا في Private Cloud، يُرجى تقديم المعلومات التالية:

  • رسالة الخطأ الكاملة التي تم رصدها للطلبات التي تعذّر تنفيذها
  • اسم المؤسسة
  • اسم البيئة
  • حزمة خادم وكيل لواجهة برمجة التطبيقات
  • ملف التتبُّع لطلبات البيانات من واجهة برمجة التطبيقات التي تعذّر تنفيذها
  • أمر curl الكامل المستخدَم لإعادة إنتاج الخطأ 502
  • سجلّات الوصول إلى NGINX /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    حيث: يتم استبدال ORG وENV وPORT# بالقيم الفعلية.

  • سجلّات نظام "معالج الرسائل" /opt/apigee/var/log/edge-message-processor/logs/system.log