أنت الآن بصدد الاطّلاع على مستندات Apigee Edge.
انتقِل إلى
مستندات Apigee X. info
المشكلة
يتلقّى تطبيق العميل رمز حالة HTTP 502 Bad Gateway مع رمز الخطأ messaging.adaptors.http.flow.DecompressionFailureAtResponse كاستجابة لطلبات البيانات من واجهة برمجة التطبيقات.
رسالة الخطأ
يتلقّى تطبيق العميل رمز الاستجابة التالي:
HTTP/1.1 502 Bad Gateway
بالإضافة إلى ذلك، قد تظهر لك رسالة خطأ مشابهة للرسالة الموضّحة أدناه:
{
"fault":{
"faultstring":"Decompression failure at response",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"
}
}
}الأسباب المحتملة
يحدث هذا الخطأ فقط في الحالات التالية:
- التشفير المحدّد في عنوان استجابة HTTP (من الخادم الخلفي/الخادم المستهدف)
Content-Encodingصالح و متوافق مع Apigee Edge، - لا يتطابق تنسيق الحمولة الذي يرسله الخادم الخلفي/الخادم المستهدف كجزء من استجابة HTTP مع تنسيق الترميز المحدّد في العنوان
Content-Encoding.
لكن
ويرجع ذلك إلى أنّ Apigee Edge يتعذّر عليه فك ترميز الحمولة باستخدام الترميز المحدّد لأنّ تنسيق الحمولة ليس بالتنسيق نفسه الذي تم تحديده في عنوان Content-Encoding.
في ما يلي بعض الأمثلة على قيم Content-Encoding المتوافقة والطريقة التي تتوقّع بها Apigee Edge أن يكون تمثيل الحمولة في هذه الحالات:
| السيناريو | Content-Encoding | تمثيل حمولة البيانات |
|---|---|---|
| الترميز الفردي | gzip | تنسيق Unix |
| الترميز الفردي | deflate | يستخدم هذا التنسيق بنية |
| الترميز المتعدد | الترميز المتعدد على سبيل المثال، في الحالات التي يتم فيها الترميز مرتين، يمكن أن يكون:
|
تم تطبيق ترميز متعدّد على الحمولة بالترتيب المحدّد كما يظهر في العنوان. |
في ما يلي الأسباب المحتملة لهذا الخطأ:
| السبب | الوصف | تعليمات تحديد المشاكل وحلّها التي تنطبق على |
|---|---|---|
| لا يتطابق تنسيق البيانات الأساسية للاستجابة مع Content-Encoding | إنّ تنسيق حمولة الاستجابة التي يرسلها الخادم الخلفي أو الخادم المستهدف إما غير مرمّز أو لا يتطابق مع الترميز المحدّد في العنوان Content-Encoding. |
مستخدمو Edge Public Cloud وEdge Private Cloud |
خطوات التشخيص الشائعة
استخدِم إحدى الأدوات أو التقنيات التالية لتشخيص هذا الخطأ:
API Monitoring
لتشخيص الخطأ باستخدام "مراقبة واجهة برمجة التطبيقات"، اتّبِع الخطوات التالية:
- سجِّل الدخول إلى واجهة مستخدم Apigee Edge بصفتك مستخدمًا لديه دور مناسب.
انتقِل إلى المؤسسة التي تريد التحقيق في المشكلة فيها.
- انتقِل إلى صفحة تحليل > مراقبة واجهة برمجة التطبيقات > التحقيق.
- اختَر الفترة الزمنية المحدّدة التي لاحظت فيها الأخطاء.
- تأكَّد من ضبط فلتر الخادم الوكيل على الكل.
- رسم بياني لرمز الخطأ مقابل الوقت
اختَر الخلية التي تحتوي على رمز الخطأ
messaging.adaptors.http.flow.DecompressionFailureAtResponseكما هو موضح أدناه:
تظهر معلومات حول رمز الخطأ
messaging.adaptors.http.flow.DecompressionFailureAtResponseكما هو موضّح أدناه:
انقر على عرض السجلات ووسِّع الصف الذي يتعذّر تنفيذه بسبب الخطأ
502.
- من نافذة السجلّات، سجِّل التفاصيل التالية:
- رمز الحالة:
502 - مصدر الخطأ:
target - رمز الخطأ:
messaging.adaptors.http.flow.DecompressionFailureAtResponse
- رمز الحالة:
- إذا كانت قيمة مصدر الخطأ هي
target، يشير ذلك إلى أنّ تنسيق حمولة الرد لم يتطابق مع الترميز المتوافق المحدّد في عنوان الاستجابة لخادم الخلفيةContent-Encoding.
أداة التتبُّع
لتشخيص الخطأ باستخدام "أداة التتبُّع"، اتّبِع الخطوات التالية:
- فعِّل جلسة التتبُّع
وأي مما يلي:
- انتظِر إلى أن يظهر الخطأ
502 Bad Gateway، أو - إذا كان بإمكانك إعادة إظهار المشكلة، أجرِ طلب البيانات من واجهة برمجة التطبيقات وأعِد إظهار
502 Bad Gateway.
- انتظِر إلى أن يظهر الخطأ
تأكَّد من تفعيل خيار عرض جميع معلومات FlowInfo:
- اختَر إحدى الاستجابات التي تعذّر تنفيذها وافحص التتبُّع.
- تنقَّل بين مراحل التتبُّع المختلفة وحدِّد مكان حدوث الخطأ.
عادةً ما يظهر الخطأ في أحد المسارات بعد مرحلة تلقّي الردّ من الخادم المستهدف كما هو موضّح أدناه:
-
دوِّن قيم الخصائص من التتبُّع:
- Content-Encoding:
gzip - نص الردّ:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- Content-Encoding:
انتقِل إلى مرحلة الخطأ بعد مرحلة تلقّي الردّ من الخادم المستهدف:
يُرجى ملاحظة السمات التالية:
- الخطأ:
Decompression failure at response - error.class:
com.apigee.errors.http.server.BadGateway error.cause:
Not in GZIP formatتوضّح السمة error.cause أنّ حمولة الاستجابة ليست بتنسيق GZIP. وهذا يعني أنّ Apigee Edge كان يتوقّع أن تكون حمولة الاستجابة بتنسيق GZIP كما هو محدّد في العنوان
Content-Encoding(تم تحديده في الخطوة السابقة).وبالتالي، لا يمكن لـ Apigee Edge فك ضغط الحمولة باستخدام gzip ويعرض الخطأDecompression failure at response.
يُرجى العِلم أنّ الردّ من الخادم المستهدف/الخادم الخلفي هو
200في هذه الحالة، ولكن سيتلقّى تطبيق العميل الردّ502لأنّ الخطأ يتم عرضه من خلال Apigee Edge.- الخطأ:
انتقِل إلى مرحلة تم إرسال الردّ إلى العميل في التتبُّع وانقر عليها.
يُرجى ملاحظة التفاصيل التالية من التتبُّع:
- رمز الحالة:
502 Bad Gateway - محتوى الخطأ:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- رمز الحالة:
انتقِل إلى مرحلة AX (تسجيل بيانات "إحصاءات Google") في التتبُّع وانقر عليها.
- انتقِل للأسفل إلى قسم تفاصيل المرحلة وعناوين الأخطاء، وحدِّد قيمتَي X-Apigee-fault-code وX-Apigee-fault-source كما هو موضّح أدناه:
- ستظهر لك قيمتا X-Apigee-fault-code وX-Apigee-fault-source
على النحو
messaging.adaptors.http.flow.DecompressionFailureAtResponseوtarget، ما يشير إلى أنّ تنسيق حمولة الردّ لم يتطابق مع الترميز المحدّد في العنوانContent-Encoding.عناوين الاستجابة القيمة X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
NGINX
لتشخيص الخطأ باستخدام سجلّات الوصول إلى NGINX، اتّبِع الخطوات التالية:
- إذا كنت مستخدمًا في Private Cloud، يمكنك استخدام سجلّات الوصول إلى 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 تطابق قيمةmessaging.adaptors.http.flow.DecompressionFailureAtResponse، حدِّد قيمة X-Apigee-fault-source.نموذج لخطأ 502 من سجلّ الوصول إلى NGINX:
يحتوي إدخال النموذج أعلاه من سجلّ الوصول إلى NGINX على القيم التالية لكل من X-Apigee-fault-code وX-Apigee-fault-source:
عناوين الاستجابة القيمة X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponseX-Apigee-fault-source target
السبب: لا يتطابق تنسيق حمولة الاستجابة مع Content-Encoding
تزيل Apigee Edge الضغط عن الحمولة تلقائيًا إذا كان عنوان الاستجابة Content-Encoding يحتوي على ترميز صالح
ومتوافق. لذلك، من المتوقّع أن يتطابق تنسيق حمولة الرد مع الترميز المحدّد في عنوان الاستجابة Content-Encoding.
إذا كان هناك عدم تطابق، سيظهر لك هذا الخطأ.
التشخيص
- حدِّد رمز الخطأ ومصدر الخطأ للخطأ الذي تم رصده باستخدام أداة مراقبة واجهة برمجة التطبيقات أو أداة التتبُّع أو سجلّات الوصول إلى NGINX كما هو موضّح في خطوات التشخيص الشائعة.
- إذا كان رمز الخطأ هو
messaging.adaptors.http.flow.DecompressionFailureAtResponseوكان مصدر الخطأ يتضمّن القيمةtarget، يشير ذلك إلى أنّ تنسيق حمولة الاستجابة التي أرسلها الخادم الخلفي/خادم الهدف لا يتطابق مع التشفير المتوافق المحدّد في عنوان الاستجابةContent-Encoding. يمكنك تحديد عدم التطابق كجزء من استجابة HTTP باستخدام إحدى الطرق التالية:
رسالة الخطأ
لإثبات صحة المعلومات باستخدام رسالة الخطأ، اتّبِع الخطوات التالية:
-
إذا كان بإمكانك الوصول إلى رسالة الخطأ الكاملة التي تلقّيتها من Apigee Edge، يُرجى الرجوع إلى
faultstring.نموذج رسالة الخطأ:
"faultstring":"Decompression failure at response"
- في رسالة الخطأ أعلاه، يظهر
"Decompression failure at response"ما يعني أنّه تعذّر فك ضغط الاستجابة باستخدام الترميز المحدّد في العنوانContent-Encoding.
التتبّع
لإثبات صحة البيانات باستخدام "التتبُّع"، اتّبِع الخطوات التالية:
- حدِّد Content-Type وerror.cause باستخدام Trace كما هو موضّح في خطوات التشخيص الشائعة.
في ما يلي القيم من التتبُّع النموذجي:
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
القيمة في عنوان الاستجابة Content-Encoding هي gzip، ولكن حمولة الاستجابة ليست بتنسيق GZIP (كما هو موضّح في error.cause). لذلك، تستجيب Apigee Edge بالرمز
502 Bad Gatewayورمز الخطأmessaging.adaptors.http.flow.DecompressionFailureAtResponse.- Content-Encoding:
الطلب الفعلي
لإثبات صحة الرمز باستخدام الطلب الفعلي، اتّبِع الخطوات التالية:
إذا كان بإمكانك الوصول إلى الطلب الفعلي المقدَّم إلى تطبيق الخادم الخلفي/الهدف، اتّبِع الخطوات التالية:
- إذا كنت مستخدمًا للسحابة الإلكترونية العامة أو الخاصة، يمكنك تقديم طلب مباشرةً إلى خادم الخلفية من خادم الخلفية نفسه أو أي جهاز آخر يُسمح لك من خلاله بتقديم الطلب إلى خادم الخلفية.
- إذا كنت مستخدمًا للسحابة الإلكترونية الخاصة، يمكنك أيضًا إرسال الطلب إلى خادم الخلفية من أحد معالِجات الرسائل.
- افحص الاستجابة التي أرسلها خادم الخلفية وحدِّد القيمة التي تم تمريرها في عنوان الاستجابة
Content-Encoding.. - تحديد تنسيق الحمولة المُرسَلة كجزء من الطلب
- إذا كانت قيمة العنوان
Content-Encodingمدرَجة في قائمة الترميز المتوافق ولكن تنسيق حمولة الاستجابة لا يتطابق مع الترميز المحدّد في العنوانContent-Encoding، يكون ذلك هو سبب المشكلة.عيّنة:
curl -v https://HOSTALIAS/test
***trimmed*** > < HTTP/1.1 200 OK < Accept-Ranges: bytes <
Content-Encoding: gzip< Date: Mon, 02 Aug 2021 08:17:35 GMT < Transfer-Encoding: chunked < < response_payload.zip Response Body(not in GZIP format)>ترسل استجابة النموذج أعلاه القيمة
gzipإلى العنوانContent-Encoding، وهو ترميز متوافق في Apigee Edge. ومع ذلك، يتم إرسالresponse_payload.zipكملف zip. لذلك، يتعذّر عرض هذه الاستجابة ويظهر الخطأ502 Bad Gatewayمع رمز الخطأ:messaging.adaptors.http.flow.DecompressionFailureAtResponse.
سجلّات "معالج الرسائل"
لإثبات صحة البيانات باستخدام سجلّات "معالج الرسائل"، اتّبِع الخطوات التالية:
إذا كنت مستخدمًا في Private Cloud، يمكنك استخدام سجلّات "معالج الرسائل" لتحديد المعلومات الأساسية حول أخطاء HTTP
502.التحقّق من سجلّ "معالج الرسائل":
/opt/apigee/var/log/edge-message-processor/logs/system.logابحث لمعرفة ما إذا كانت هناك أي أخطاء
502خلال مدة زمنية محددة (إذا حدثت المشكلة في الماضي) أو ما إذا كانت هناك أي استجابات لا تزال تتضمّن الخطأ502. يمكنك استخدام سلسلة البحث التالية:grep -ri "ZipException"
ستجد أسطرًا من system.log مشابهة لما يلي:
السيناريو 1
السيناريو 1: عندما يتضمّن ردّ واجهة برمجة التطبيقات العنوان Content-Encoding: gzip
2021-08-02 06:50:25,433 NIOThread@2 ERROR HTTP.CLIENT - HTTPClient$Context.onInputException() : ClientInputChannel(ClientChannel[Connected: Remote:3.8.1.1:9000 Local:10.0.115.32:41298]@38140 useCount=1 bytesRead=0 bytesWritten=203 age=469ms lastIO=0ms isOpen=true).onExceptionRead exception: {}java.util.zip.ZipException: Not in GZIP format---trimmed-- 2021-08-02 06:50:25,433 NIOThread@2 INFO HTTP.CLIENT - HTTPClient$Context.logContextDetails() : Request details : host=null path=/folder/testFile method=GET. Channel details : Bytes read=0 2021-08-02 06:50:25,434 NIOThread@2 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@4806fdab, Not in GZIP format) 2021-08-02 06:50:25,434 NIOThread@2 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exceptionjava.util.zip.ZipException: Not in GZIP formatoccurred while writing to channel null 2021-08-02 06:50:25,434 NIOThread@2 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: Not in GZIP formatيشير السطر
java.util.zip.ZipException: Not in GZIP formatفي رسالة الخطأ أعلاه إلى أنّه لم يتم إرسال حمولة الرد بتنسيق GZIP على الرغم من تحديدContent-Encodingعلى أنّه gzip. لذلك، يعرض Apigee Edge الاستثناء ويعرض رمز الحالة502مع رمز الخطأmessaging.adaptors.http.flow.DecompressionFailureAtResponseلتطبيقات العميل.السيناريو 2
السيناريو 2: عندما يتضمّن ردّ واجهة برمجة التطبيقات العنوان Content-Encoding: deflate
2021-08-02 06:35:21,215 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context.onInputException() : ClientInputChannel(ClientChannel[Connected: Remote:3.8.1.1:9000 Local:192.168.194.140:35224]@36014 useCount=1 bytesRead=0 bytesWritten=202 age=439ms lastIO=2ms isOpen=true).onExceptionRead exception: {}java.util.zip.ZipException: incorrect header check---trimmed---- Caused by:java.util.zip.DataFormatException: incorrect header check---trimmed--- 2021-08-02 06:35:21,215 NIOThread@0 INFO HTTP.CLIENT - HTTPClient$Context.logContextDetails() : Request details : host=null path=/folder/testFile method=GET. Channel details : Bytes read=0 2021-08-02 06:35:21,216 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError(HTTPResponse@3966e277, incorrect header check) 2021-08-02 06:35:21,216 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception java.util.zip.ZipException: incorrect header check occurred while writing to channel null 2021-08-02 06:35:21,217 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: incorrect header checkيشير السطران
java.util.zip.ZipException: incorrect header checkوCaused by: java.util.zip.DataFormatException: incorrect header checkفي رسالة الخطأ أعلاه إلى أنّه لم يتم إرسال حمولة الاستجابة بتنسيق deflate وأنّها لا تتطابق مع الترميز المحدّد في عنوانContent-Encodingالخاص بتنسيق deflate. لذلك، يعرض Apigee Edge الاستثناء ويعرض رمز الحالة502مع رمز الخطأmessaging.adaptors.http.flow.DecompressionFailureAtResponseلتطبيقات العميل.
-
الدقة
- إذا لم تكن هناك حاجة إلى حمولة الاستجابة المضغوطة في مسار خادم وكيل لواجهة برمجة التطبيقات في Apigee Edge
وفي خادم الخلفية، لا تمرِّر العنوان
Content-Encoding. إذا كان من الضروري ضغط حمولة الرد، انتقِل إلى الخطوة 2. - إذا كان من الضروري ضغط حمولة الاستجابة، تأكَّد من أنّ خادم الخلفية يرسل دائمًا ما يلي:
- أي من
عمليات الترميز المتوافقة كقيمة لعنوان
Content-Encodingفي الاستجابة - تتطابق حمولة الاستجابة بالتنسيق المتوافق مع Apigee Edge مع تنسيق الترميز المحدّد في العنوان
Content-Encoding
- أي من
عمليات الترميز المتوافقة كقيمة لعنوان
- في المثال الموضّح أعلاه، تكون حمولة الرد بتنسيق ZIP، ولكن يحدّد عنوان الاستجابة
Content-Encoding: gzip. يمكنك حلّ المشكلة من خلال إرسال عنوان الاستجابة بالتنسيقContent-Encoding: gzipوحِمل الاستجابة بالتنسيقgzip:curl -v https://HOSTALIAS/v1/test
> < HTTP/1.1 200 OK < Accept-Ranges: bytes <
Content-Encoding: gzip< Date: Mon, 02 Aug 2021 08:17:35 GMT < Transfer-Encoding: chunked < < response_payload.gz Response Body(in GZIP format)>
المواصفات
تستجيب Apigee Edge برمز الحالة 502 Bad Gateway مع رمز الخطأ
messaging.adaptors.http.flow.DecompressionFailureAtResponse وفقًا لمواصفات RFC التالية:
| المواصفات |
|---|
| RFC 7231، القسم 6.5.1 |
| RFC 7231، القسم 3.1.2.2 |
إذا كنت لا تزال بحاجة إلى أي مساعدة من فريق دعم Apigee، انتقِل إلى المعلومات التشخيصية التي يجب جمعها.
يجب جمع معلومات التشخيص
اجمع معلومات التشخيص التالية، ثم تواصَل مع فريق دعم Apigee Edge:
إذا كنت مستخدمًا لخدمة السحابة الإلكترونية العامة، يُرجى تقديم المعلومات التالية:
- اسم المؤسسة
- اسم البيئة
- اسم خادم وكيل لواجهة برمجة التطبيقات
- أمر
curlالكامل المستخدَم لإعادة إنتاج الخطأ502 - ملف التتبُّع للردود من واجهة برمجة التطبيقات
إذا كنت مستخدمًا في Private 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