يتم الآن عرض مستندات Apigee Edge.
انتقِل إلىمستندات Apigee X. info
المشكلة
يتلقّى تطبيق العميل رمز حالة HTTP هو 502 Bad Gateway مع رمز الخطأ
protocol.http.DuplicateHeader كاستجابة لطلبات البيانات من واجهة برمجة التطبيقات.
رسالة الخطأ
يتلقّى تطبيق العميل رمز الاستجابة التالي:
HTTP/1.1 502 Bad Gateway
بالإضافة إلى ذلك، قد تظهر لك رسالة خطأ مشابهة للرسالة الموضحة أدناه:
{
"fault":{
"faultstring":"Duplicate Header \"Expires\"",
"detail":{
"errorcode":"protocol.http.DuplicateHeader"
}
}
}الأسباب المحتمَلة
يحدث هذا الخطأ إذا ظهر رأس HTTP معيّن أكثر من مرة بقيم متطابقة أو مختلفة، كجزء من استجابة HTTP التي يرسلها خادم الخلفية إلى Apigee Edge، مع العلم أنّه لا يُسمح بأن يتضمّن هذا الرأس نسخًا مكرّرة في Apigee Edge.
وفقًا للقسم 3.2.2: ترتيب الحقول
من RFC 7230، يجب ألا يُنشئ المُرسِل حقول
رؤوس متعددة لها اسم الحقل نفسه في رسالة ما، إلا إذا تم تحديد قيمة الحقل بالكامل لهذا
الحقل على أنّها قائمة قيم مفصولة بفاصلة، [أي #(values)] أو إذا كان حقل الرأس استثناءً معروفًا. إذا وجد Apigee Edge أنّ رأسًا معيّنًا لا يُسمح بأن يتضمّن نسخًا مكرّرة، وتم إرساله أكثر من مرة في استجابة HTTP التي يرسلها الخادم المستهدف أو خادم الخلفية، فإنّه يستجيب برمز الحالة 502 Bad Gateway ورمز الخطأ protocol.http.DuplicateHeader
في ما يلي الأسباب المحتمَلة لهذا الخطأ:
| السبب | الوصف | تعليمات تحديد المشاكل وحلّها التي تنطبق على |
|---|---|---|
| رأس مكرّر في الاستجابة | تحتوي الاستجابة من خادم الخلفية على رؤوس مكرّرة. | مستخدمو السحابة الإلكترونية العامة والخاصة في Edge |
الخطوات الشائعة لتشخيص المشكلة
استخدِم إحدى الأدوات أو التقنيات التالية لتشخيص هذا الخطأ:
مراقبة واجهة برمجة التطبيقات
لتشخيص الخطأ باستخدام "مراقبة واجهة برمجة التطبيقات"، اتّبِع الخطوات التالية:
- سجِّل الدخول إلى واجهة مستخدم Apigee Edge كمستخدم لديه دور مناسب.
انتقِل إلى المؤسسة التي تريد التحقيق في المشكلة فيها.

- انتقِل إلى صفحة تحليل > مراقبة واجهة برمجة التطبيقات > التحقيق.
- اختَر الإطار الزمني المحدّد الذي لاحظت فيه الأخطاء.
- تأكَّد من ضبط فلتر الخادم الوكيل على الكل.
- ارسِم رمز الخطأ مقابل الوقت.
اختَر خلية تحتوي على رمز الخطأ
protocol.http.DuplicateHeaderكما هو موضّح أدناه:
تظهر معلومات عن رمز الخطأ
protocol.http.DuplicateHeaderكما هو موضّح أدناه:
- تأكَّد من أنّ رمز الحالة هو
502كما هو موضّح في المثال أعلاه. - انقر على عرض السجلّات ووسِّع صف الطلب الذي تعذّر تنفيذه.
من نافذة "السجلّات"، دوِّن التفاصيل التالية:
- رمز الحالة:
502 - مصدر الخطأ:
target - رمز الخطأ:
protocol.http.DuplicateHeader.
- رمز الحالة:
- إنّ مصدر الخطأ هو
target، ما يشير إلى أنّ الاستجابة من خادم الخلفية كانت تحتوي على رؤوس مكرّرة.
أداة التتبُّع
لتشخيص الخطأ باستخدام "أداة التتبُّع"، اتّبِع الخطوات التالية:
- فعِّل جلسة التتبُّع وقم بأحد الإجراءَين التاليَين:
- انتظِر حدوث الخطأ
502 Bad Gatewayأو - إذا كان بإمكانك إعادة إنتاج المشكلة، نفِّذ طلب بيانات من واجهة برمجة التطبيقات وأعِد إنتاج الخطأ
502 Bad Gateway
- انتظِر حدوث الخطأ
تأكَّد من تفعيل الخيار عرض جميع معلومات التدفق:

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

دوِّن قيمة الخطأ من التتبُّع.
يعرض نموذج التتبُّع أعلاه الخطأ على أنّه
Duplicate Header "Expires". بما أنّ Apigee هو من أثار الخطأ بعد إرسال الطلب إلى خادم الخلفية، يشير ذلك إلى أنّ خادم الخلفية أرسل الرأسExpiresأكثر من مرة.- انتقِل إلى مرحلة AX (بيانات الإحصاءات المسجّلة) في التتبُّع وانقر عليها.
انتقِل للأسفل إلى قسم تفاصيل المرحلة - رؤوس الاستجابة وحدِّد قيمتَي X-Apigee-fault-code وX-Apigee-fault-source كما هو موضّح أدناه:

- ستظهر لك قيمتا X-Apigee-fault-code وX-Apigee-fault-source على أنّهما
protocol.http.DuplicateHeaderوtarget، ما يشير إلى أنّ هذا الخطأ ناتج عن إرسال خادم الخلفية رؤوسًا مكرّرة لعنوان الاستجابةExpires.عناوين الاستجابة القيمة X-Apigee-fault-code protocol.http.DuplicateHeaderX-Apigee-fault-source target تحقَّق مما إذا كنت تستخدم تسلسل الخوادم الوكيلة؛ أي إذا كان الخادم المستهدف أو نقطة النهاية المستهدَفة يستدعيان خادمًا وكيلاً آخر في Apigee.
لتحديد ذلك، انتقِل مرة أخرى إلى مرحلة الطلب المُرسَل إلى الخادم المستهدف. انقر على عرض أمر curl.
تُفتح نافذة أمر curl للطلب المُرسَل إلى الخادم المستهدف التي يمكنك من خلالها تحديد الاسم المستعار لمضيف الخادم المستهدف.
- إذا كان الاسم المستعار لمضيف الخادم المستهدف يشير إلى اسم مستعار لمضيف افتراضي، يكون ذلك تسلسلاً للخوادم الوكيلة. في هذه الحالة، عليك تكرار جميع الخطوات أعلاه للخادم الوكيل المتسلسل إلى أن
تحدّد السبب الفعلي للخطأ
502 Bad Gateway. - إذا كان الاسم المستعار لمضيف الخادم المستهدف يشير إلى خادم الخلفية، يشير ذلك إلى أنّ خادم الخلفية يرسل الرؤوس المكرّرة في الاستجابة إلى Apigee.
NGINX
لتشخيص الخطأ باستخدام سجلّات الوصول إلى NGINX، اتّبِع الخطوات التالية:
- إذا كنت مستخدمًا للسحابة الإلكترونية الخاصة، يمكنك استخدام سجلّات الوصول إلى NGINX لـ
تحديد المعلومات الرئيسية حول أخطاء HTTP
502. راجِع سجلّات الوصول إلى NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logملاحظة: يتم استبدال ORG وENV وPORT# بالقيم الفعلية.
- ابحث لمعرفة ما إذا كانت هناك أي أخطاء
502خلال مدة معيّنة (إذا حدثت المشكلة في الماضي) أو إذا كانت هناك أي طلبات لا تزال تتعذّر مع ظهور الخطأ502. إذا عثرت على أي أخطاء
502وكان X-Apigee-fault-code يطابق قيمةprotocol.http.DuplicateHeader، فحدِّد قيمة X-Apigee-fault-source.نموذج لخطأ 502 من سجلّ الوصول إلى NGINX:
يحتوي الإدخال النموذجي أعلاه من سجلّ الوصول إلى NGINX على القيمتَين التاليتَين لـ X- Apigee-fault-code وX-Apigee-fault-source:
عناوين الاستجابة القيمة X-Apigee-fault-code protocol.http.DuplicateHeaderX-Apigee-fault-source target
السبب: رأس مكرّر في الاستجابة
التشخيص
- حدِّد رمز الخطأ ومصدر الخطأ للخطأ الذي تم رصده باستخدام "مراقبة واجهة برمجة التطبيقات" أو سجلّات الوصول إلى NGINX كما هو موضّح في الخطوات الشائعة لتشخيص المشكلة.
- إذا كانت قيمة مصدر الخطأ هي
target، يشير ذلك إلى أنّ الاستجابة التي أرسلها الخادم المستهدف تحتوي على رؤوس مكرّرة. يمكنك تحديد الرأس الفعلي الذي تم إرساله أكثر من مرة كجزء من الاستجابة باستخدام إحدى الطريقتَين التاليتَين:
رسالة الخطأ
باستخدام رسالة الخطأ:
إذا كان بإمكانك الوصول إلى رسالة الخطأ الكاملة التي تم تلقّيها من Apigee Edge، يُرجى الرجوع إلى
faultstring. يحتويfaultstringعلى اسم الرأس الذي تم إرساله أكثر من مرة.نموذج لرسالة الخطأ:
"faultstring":"Duplicate Header \"Expires\""
- في رسالة الخطأ أعلاه، يمكنك ملاحظة أنّه تم إرسال الرأس
Expiresأكثر من مرة كما هو موضّح فيfaultstring.
الطلب الفعلي
باستخدام الطلب الفعلي:
- إذا لم يكن بإمكانك الوصول إلى الطلب الفعلي الذي تم إرساله إلى الخادم المستهدف، احصل على أمر
curlالمقابل من الخطوة 10.أ والخطوة 10.ب في مقالة استخدام "أداة التتبُّع". إذا كان بإمكانك الوصول إلى الطلب الفعلي الذي تم إرساله إلى تطبيق الخادم المستهدف، اتّبِع الخطوات التالية:
أجرِ مكالمة إلى الخادم المستهدف.
نموذج للطلب المُرسَل إلى الخادم المستهدف المستخدَم في هذا المثال:
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
تحقَّق من قائمة الرؤوس التي تظهر في الاستجابة.
نموذج للاستجابة من الخادم المستهدف المستخدَم في هذا المثال:
* ...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.إذا ظهر الرأس الذي يظهر اسمه في
faultstringأكثر من مرة في استجابة خادم الخلفية، يكون ذلك هو سبب هذا الخطأ. في الحالة أعلاه، تم إرسال الرأسExpiresأكثر من مرة.
الدقة
إصلاح التكرار
الخيار 1 [الخيار المُقترَح]: إصلاح خادم الخلفية لعدم تضمين رؤوس مكرّرة
- حلِّل سبب إرسال خادم الخلفية المحدّد للرأس المكرّر
Expiresوتأكَّد مما إذا كان من المقبول أن تقبل الخوادم الوكيلة لواجهة برمجة التطبيقات ذلك. في معظم الحالات، لن يكون ذلك مرغوبًا فيه وفقًا لمواصفات HTTP في RFC7230. - إذا لم يكن ذلك مرغوبًا فيه، عدِّل تطبيق الخادم المستهدف لكي لا يرسل رؤوسًا مكرّرة.
في المثال الذي تمت مناقشته أعلاه، يُلاحَظ أنّه تم إرسال الرأس
Expiresمرّتَين بالقيمة نفسها، وهو أمر غير مرغوب فيه. يمكنك حلّ المشكلة من خلال التأكّد من أنّ الخادم المستهدف يمرِّر الرأسExpiresمرة واحدة فقط. - إذا كان ذلك مرغوبًا فيه وأردت السماح بالرؤوس المكرّرة، انتقِل إلى الخيار 2: استخدام خاصية CwC.
CwC
الخيار 2: استخدام خاصية CwC
توفر Apigee خاصية CwC
HTTPHeader.<HeaderName> ،التي تسمح لتطبيقات العملاء والخوادم المستهدفة بإرسال رؤوس مكررة إلى الخوادم الوكيلة لواجهة برمجة التطبيقات في Apigee Edge.
| خاصية CwC | القيم |
|---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
على سبيل المثال، يمكن ضبط الخاصية التالية على "معالجات الرسائل" للسماح بالنسخ المكرّرة
والقيم المتعددة للرأس Expires.
HTTPHeader.Expires=allowDuplicates, multiValued
- إذا كنت مستخدمًا للسحابة الإلكترونية الخاصة، يمكنك ضبط الخاصية لمنع Apigee
Edge من إظهار الخطأ
502 Bad Gateway، حتى إذا كان الطلب يحتوي على رؤوس مكرّرة، وذلك باستخدام دليل الإجراءات كيفية ضبط "معالجات الرسائل" لاستخدام رؤوس مكرّرة. - إذا كنت مستخدمًا للسحابة الإلكترونية العامة، يُرجى التواصل مع فريق دعم Apigee Edge لضبط هذه الخاصية لمؤسستك.
المواصفات
يستجيب Apigee برمز الاستجابة للخطأ 502 Bad Gateway لأنّه يتوقّع أن يتصرف خادم الخلفية وفقًا لمواصفات RFC التالية:
| المواصفات |
|---|
| RFC 7230، القسم 3.2.2: ترتيب الحقول |
| RFC 7230، القسم 3.2: حقول الرأس |
إذا كنت لا تزال بحاجة إلى أي مساعدة من فريق دعم Apigee، انتقِل إلى يجب جمع معلومات التشخيص.
يجب جمع معلومات التشخيص
اجمع معلومات التشخيص التالية، ثم تواصَل مع فريق دعم Apigee Edge.
إذا كنت مستخدمًا للسحابة الإلكترونية العامة، قدِّم المعلومات التالية:
- اسم المؤسسة
- اسم البيئة
- اسم الخادم الوكيل لواجهة برمجة التطبيقات
- أمر
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