502 مدخل غير صالح - رأس الصفحة مكرر

يتم الآن عرض مستندات Apigee Edge.
انتقِل إلى مستندات Apigee X.
المعلومات

المشكلة

يحصل تطبيق العميل على رمز حالة HTTP لـ 502 Bad Gateway مع رمز الخطأ protocol.http.DuplicateHeader كاستجابة لطلبات واجهة برمجة التطبيقات.

رسالة الخطأ

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

HTTP/1.1 502 Bad Gateway

بالإضافة إلى ذلك، قد تلاحظ رسالة خطأ مشابهة للرسالة المعروضة أدناه:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

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

يحدث هذا الخطأ إذا ظهر عنوان HTTP معيّن غير مسموح له بإنشاء نُسخ طبق الأصل من عنوان URL في Apigee Edge أكثر من مرة بقيم مماثلة أو بقيم مختلفة، وذلك كجزء من استجابة HTTP التي يرسلها خادم الخلفية إلى Apigee Edge.

وفقًا لـ RFC 7230، القسم 3.2.2: الترتيب الميداني، يجب ألا ينشئ المُرسِل حقول عناوين متعددة تحمل اسم الحقل نفسه في الرسالة ما لم يتم تحديد قيمة الحقل بالكامل لحقل العنوان هذا على أنها قائمة مفصولة بفواصل، [أي #(values)] أو حقل العنوان هو استثناء معروف. إذا رصد Apigee Edge أنّ عنوانًا معيّنًا محدّدًا، غير مسموح له بالحصول على نُسخ طبق الأصل، يتم إرساله أكثر من مرة في استجابة HTTP التي يرسلها الخادم الهدف/الخلفية، يستجيب بالرمز 502 Bad Gateway ورمز الخطأ protocol.http.DuplicateHeader.

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

السبب الوصف تعليمات تحديد المشاكل وحلّها السارية على
عنوان مكرّر في الرد تحتوي الاستجابة من الخادم الخلفية على عناوين مكررة. مستخدمو Edge العام والخاص على السحابة الإلكترونية

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

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

مراقبة واجهة برمجة التطبيقات

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

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

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

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

  8. يتم عرض معلومات عن رمز الخطأ protocol.http.DuplicateHeader كما هو موضح أدناه:

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

  9. تأكَّد من أنّ رمز الحالة هو 502 كما هو موضّح في المثال أعلاه.
  10. انقر على عرض السجلات ووسِّع الصف المتعلق بالطلب الذي تعذّر إكماله.
  11. من نافذة السجلّات، لاحظ التفاصيل التالية:

    • رمز الحالة: 502
    • مصدر الخطأ: target
    • رمز الخطأ: protocol.http.DuplicateHeader.
  12. مصدر الخطأ هو target، ما يشير إلى احتواء الاستجابة من الخادم الخلفية على عناوين مكررة.

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

لتشخيص الخطأ باستخدام أداة التتبُّع:

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

  3. اختَر أحد الطلبات التي تعذّر تنفيذها وافحص بيانات التتبّع.
  4. تنقَّل عبر المراحل المختلفة من عملية التتبُّع وحدِّد مكان حدوث الفشل.
  5. ستجد الخطأ عادةً في عملية تدفق بعد مرحلة تم إرسال الطلب إلى الخادم المستهدف كما هو موضّح أدناه:

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

  6. دوِّن قيمة الخطأ في عملية التتبّع.

    يعرض تقرير تتبُّع النموذج أعلاه الخطأ على أنّه Duplicate Header "Expires". وبما أنّ الخطأ يرفع من قِبل Apigee بعد إرسال الطلب إلى خادم الخلفية، فهو يشير إلى أنّ خادم الخلفية أرسل العنوان Expires أكثر من مرة.

  7. انتقِل إلى مرحلة AX (بيانات "إحصاءات Google" المسجّلة) في التتبُّع وانقر عليها.
  8. انتقِل للأسفل إلى القسم Stage Details - Response Headers (تفاصيل المرحلة - عناوين الاستجابة) وحدِّد قيم X-Apigee-Error-code وX-Apigee-error-source كما هو موضّح أدناه:

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

  9. ستظهر قيمتا X-Apigee-fault-code وX-Apigee-fault-code، على أنّه protocol.http.DuplicateHeader وtarget، ما يشير إلى أنّ هذا الخطأ حدث بسبب تمرير خادم الخلفية لعنوان الاستجابة Expires بشكل متكرر.
    عناوين الاستجابة القيمة
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. تحقَّق مما إذا كنت تستخدم تسلسل الخادم الوكيل، وذلك إذا كان الخادم الهدف أو نقطة النهاية الهدف يستدعي خادمًا وكيلاً آخر في Apigee.

    1. لتحديد ذلك، انتقِل مرة أخرى إلى مرحلة الخادم تم إرسال الطلب إلى الهدف. انقر على Show Curl (إظهار عنوان URL).

    2. ستفتح نافذة تجانس طلب تم الإرسال إلى الخادم الهدف والتي يمكنك من خلالها تحديد الاسم المستعار لمضيف الخادم الهدف.

    3. إذا كان الاسم المستعار لمضيف الخادم الهدف يشير إلى اسم مستعار لمضيف افتراضي، يكون ذلك في هذه الحالة تسلسل الخادم الوكيل. في هذه الحالة، يجب تكرار جميع الخطوات السابقة للخادم الوكيل المتسلسل إلى أن تحدّد السبب الفعلي لخطأ 502 Bad Gateway.
    4. إذا كان الاسم المستعار لمضيف الخادم الهدف يشير إلى خادم الخلفية، فإنه يشير إلى أن خادم الخلفية يرسل رؤوسًا مكررة في استجابة Apigee.

NGINX

لتشخيص الخطأ باستخدام سجلات الوصول إلى NGINX:

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

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

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

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

    نموذج خطأ 502 من سجل وصول NGINX:

    يحتوي إدخال النموذج أعلاه من سجل NGINX Access على القيم التالية للسمة X- Apigee-error-code وX-Apigee-error-source:.

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

السبب: عنوان مكرر في الاستجابة

التشخيص

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

    رسالة الخطأ

    استخدام رسالة الخطأ:

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

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

      "faultstring":"Duplicate Header \"Expires\""
      
    2. في رسالة الخطأ أعلاه، يظهر لك أنّ العنوان Expires تم إرساله أكثر من مرة كما هو موضّح في faultstring.

    الطلب الفعلي

    باستخدام الطلب الفعلي:

    1. إذا لم يكن لديك إذن بالوصول إلى الطلب الفعلي الذي تم إجراؤه على الخادم الهدف، يمكنك الحصول على أمر curl المقابل من الخطوة 10.أ و10.ب إلى استخدام أداة التتبُّع.
    2. إذا كان بإمكانك الوصول إلى الطلب الفعلي الذي تم إجراؤه على تطبيق الخادم الهدف، نفِّذ الخطوات التالية:

      1. إجراء اتصال بالخادم الهدف.

        نموذج طلب للخادم الهدف المُستخدَم في هذا المثال:

        curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
        
      2. تحقَّق من قائمة العناوين التي تظهر في الرد.

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

        * ...Trimmed...
        > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2
        > Host: BACKEND_SERVER_HOST
        > User-Agent: curl/7.64.1
        > Accept: */*
        >
        * Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
        < HTTP/2 200
        < date: Fri, 02 Jul 2021 05:29:07 GMT
        < content-type: application/json
        < content-length: 166
        < server: gunicorn/19.9.0
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < access-control-allow-origin: *
        < access-control-allow-credentials: true
        <
        ----<Response BODY>------
        * Connection #0 to host httpbin.org left intact
        * Closing connection 0
        

        في نموذج الطلب أعلاه، يتم إرسال العنوان Expires أكثر من مرة. ولذلك، يتعذّر تنفيذ هذا الطلب مع ظهور الخطأ 502 Bad Gateway ورمز الخطأ: protocol.http.DuplicateHeader.

      3. إذا ظهر العنوان الذي يظهر اسمه في faultstring أكثر من مرة في استجابة خادم الخلفية، يكون ذلك هو سبب هذا الخطأ. في الحالة المذكورة أعلاه، يتم إرسال العنوان Expires أكثر من مرة.

درجة الدقّة

إصلاح التكرار

الخيار #1 [الخيار المُقترَح] إصلاح خادم الخلفية لعدم تضمين الرؤوس المكرّرة

  1. حلِّل سبب إرسال خادم الخلفية المحدَّد للرأس المكرَّر Expires وتحقَّق مما إذا كان من المقبول أن تقبل الخوادم الوكيلة لواجهة برمجة التطبيقات هذا السبب. وفي معظم الحالات، لن يكون مرغوبًا فيه وفقًا لمواصفات HTTP RFC7230.
  2. إذا لم يكن مرغوبًا فيه، عدِّل تطبيق الخادم المستهدف لعدم إرسال رؤوس مكررة. في المثال الذي تمت مناقشته أعلاه، لوحظ أنه يتم إرسال العنوان Expires مرتين بالقيمة نفسها، وهذا أمر غير مرغوب فيه. يمكنك حل هذه المشكلة من خلال التأكّد من أنّ الخادم الهدف يمرِّر عنوان Expires مرة واحدة فقط.
  3. وإذا كان ذلك مرغوبًا فيه وتريد السماح بالعناوين المكرّرة، انتقِل إلى الخيار #2 استخدام سمة CwC.

CwC

الخيار 2: استخدام سمة "CwC"

توفّر Apigee سمة CwC HTTPHeader.<HeaderName> التي تسمح لتطبيقات العميل والخوادم المستهدفة بإرسال عناوين مكرّرة إلى الخوادم الوكيلة لواجهة برمجة التطبيقات في Apigee Edge.

سمة "CwC" القيم
HTTPHeader.<HeaderName> allowDuplicates,multivalued

على سبيل المثال، يمكن ضبط السمة التالية في "معالجات الرسائل" للسماح بالتكرار والقيمة المتعددة للعنوان Expires.

HTTPHeader.Expires=allowDuplicates, multiValued
  1. إذا كنت مستخدمًا على السحابة الإلكترونية الخاصة، يمكنك ضبط الموقع لمنع Apigee Edge من رفع الخطأ 502 Bad Gateway، حتى إذا كان الطلب يحتوي على عناوين مكرّرة باستخدام دليل الإرشادات حول ضبط معالجات الرسائل لاستخدام العناوين المكرّرة.
  2. إذا كنت مستخدمًا على Cloud Cloud، يُرجى التواصل مع فريق دعم Apigee Edge لضبط هذا الموقع لمؤسستك.

المواصفات

يستجيب فريق Apigee لاستجابة الخطأ 502 Bad Gateway لأنّه يتوقّع أن يعمل خادم الخلفية وفقًا لمواصفات RFC التالية:

المواصفات
RFC 7230، القسم 3.2.2: ترتيب الحقول
RFC 7230، القسم 3.2: حقول العناوين

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

ضرورة جمع معلومات التشخيص

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

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

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

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

  • رسالة الخطأ الكاملة التي تم رصدها للطلبات التي تعذّر تنفيذها
  • اسم البيئة
  • حزمة الخادم الوكيل لواجهة برمجة التطبيقات
  • ملف التتبُّع الخاص بطلبات واجهة برمجة التطبيقات
  • سجلات وصول 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