502 مدخل غير صالح - إلغاء الضغط مضغوط لـFailureAtResponse

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

المشكلة

يحصل تطبيق العميل على رمز حالة 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 تمثيل الحمولة في تلك الحالات:

السيناريو ترميز المحتوى تمثيل الحمولة
ترميز فردي gzip

تنسيق Unix gzip

راجِع تنسيق RFC1952 GZIP.

ترميز فردي انكماش

يستخدِم هذا التنسيق بنية zlib مع خوارزمية ضغط الانكماش.

راجِع RFC1950 و RFC1951..

الترميز المتعدد

الترميز المتعدد

على سبيل المثال، في الحالات التي يتم فيها إجراء الترميز مرتين، يمكن أن يكون:

  • gzip، deflate
  • gzip وgzip
  • deflate، gzip
  • انكماش، انكماش
تم تطبيق ترميز متعدد على الحمولة بالترتيب المحدد الذي يظهر في العنوان.

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

السبب الوصف تعليمات تحديد المشاكل وحلّها السارية على
لا يتطابق تنسيق حمولة الاستجابة مع تنسيق Content-Encoding إنّ تنسيق حمولة الاستجابة المُرسَل من خادم الخلفية/الهدف إما غير مرمّز أو لا يتطابق مع الترميز المحدّد في عنوان Content-Encoding. مستخدمو Edge العام والخاص على السحابة الإلكترونية

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

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

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

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

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

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

    ( عرض صورة أكبر حجمًا)

  8. يتم عرض المعلومات عن رمز الخطأ messaging.adaptors.http.flow.DecompressionFailureAtResponse كما هو موضّح أدناه:

    ( عرض صورة أكبر حجمًا)

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

    ( عرض صورة أكبر حجمًا)

  10. من نافذة السجلّات، دوِّن التفاصيل التالية:
    • رمز الحالة: 502
    • مصدر الخطأ: target
    • رمز الخطأ: messaging.adaptors.http.flow.DecompressionFailureAtResponse.
  11. إذا كانت القيمة target في مصدر الخطأ، يشير ذلك إلى أنّ تنسيق حمولة الاستجابة لا يتطابق مع الترميز المتوافق المحدّد في عنوان الاستجابة Content-Encoding لخادم الخلفية.

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

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

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

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

    ( عرض صورة أكبر حجمًا)

  6. دوِّن قيم السمات من صفحة التتبّع:

    • ترميز المحتوى: gzip
    • نص الرد: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  7. انتقِل إلى مرحلة الخطأ بعد مرحلة الاستجابة المُستلَمة من الخادم الهدف:

    ( عرض صورة أكبر حجمًا)

    انتبه إلى الخصائص:

    • خطأ: 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.

  8. انتقِل إلى مرحلة الرد المُرسَل إلى العميل في سجلّ التتبُّع وانقر عليه.

    ( عرض صورة أكبر حجمًا)

    دوِّن التفاصيل التالية من صفحة التتبّع:

    • رمز الحالة: 502 Bad Gateway.
    • محتوى الخطأ: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. انتقِل إلى مرحلة AX (بيانات "إحصاءات Google" المسجّلة) في التتبُّع وانقر عليها.

  10. انتقِل للأسفل إلى قسم Stage Details (تفاصيل المرحلة) وError Headers (عناوين الخطأ) وحدِّد قيمتَي X-Apigee-Error-code وX-Apigee-fulfillment-source كما هو موضّح أدناه:

    ( عرض صورة أكبر حجمًا)

  11. ستظهر قيم السمتَين X-Apigee-fault-code وX-Apigee-fault-code على أنّه messaging.adaptors.http.flow.DecompressionFailureAtResponse وtarget، ما يشير إلى أنّ تنسيق حمولة الاستجابة لا يتطابق مع الترميز المحدّد في العنوان Content-Encoding.
    عناوين الاستجابة القيمة
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

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-fault-code الذي يتطابق مع قيمة messaging.adaptors.http.flow.DecompressionFailureAtResponse، حدِّد قيمة X-Apigee-fault-code

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

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

    عناوين الاستجابة القيمة
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

السبب: لا يتطابق تنسيق حمولة الاستجابة مع تنسيق Content-Encoding

وفقًا للإعدادات التلقائية، يفكّ Apigee Edge الحمولة دائمًا إذا كان عنوان الاستجابة Content-Encoding يحتوي على ترميز متوافق وصالح. وبالتالي، من المتوقّع أن يتطابق تنسيق حمولة الاستجابة مع الترميز المحدّد في عنوان الاستجابة Content-Encoding. وفي حال عدم التطابق، ستحصل على هذا الخطأ.

التشخيص

  1. حدِّد رمز الخطأ ومصدر الخطأ للخطأ الذي يتم رصده باستخدام مراقبة واجهة برمجة التطبيقات أو أداة التتبُّع أو سجلات الوصول إلى NGINX كما هو موضّح في خطوات التشخيص الشائعة.
  2. إذا كان رمز الخطأ هو messaging.adaptors.http.flow.DecompressionFailureAtResponse وكانت القيمة target لمصدر الخطأ، يعني ذلك أنّ تنسيق حمولة الاستجابة الذي تم إرساله من خادم الخلفية/الهدف لا يتطابق مع الترميز المتوافق المحدّد في عنوان الاستجابة Content-Encoding.
  3. يمكنك تحديد عدم التطابق كجزء من استجابة HTTP باستخدام إحدى الطرق التالية:

    رسالة الخطأ

    للتأكُّد من استخدام رسالة الخطأ، اتّبِع الخطوات التالية:

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

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

      "faultstring":"Decompression failure at response"
      
    2. في رسالة الخطأ أعلاه، يتم عرض "Decompression failure at response"، ما يعني أنّه تعذّر فك ضغط الاستجابة باستخدام الترميز المحدّد في العنوان Content-Encoding.

    التتبّع

    للتحقق من استخدام التتبع:

    1. حدِّد نوع المحتوى وerror.cause باستخدام التتبُّع كما هو موضَّح في خطوات التشخيص الشائعة.
    2. في ما يلي القيم من تتبُّع العينة:

      • ترميز المحتوى: gzip
      • error.cause: Not in GZIP format

      القيمة في عنوان الاستجابة Content-Encoding هي قيمة gzip، لكنّ حمولة الاستجابة ليست بتنسيق GZIP (كما هو موضّح في error.cause). لذلك، يستجيب Apigee Edge باستخدام 502 Bad Gateway ورمز الخطأ messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    الطلب الفعلي

    للتحقّق من استخدام الطلب الفعلي:

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

    1. إذا كنت من مستخدمي السحابة الإلكترونية العامة/السحابة الإلكترونية الخاصة، يمكنك تقديم طلب مباشرةً إلى خادم الخلفية من خادم الخلفية نفسه أو أي جهاز آخر يُسمح لك منه بتقديم الطلب إلى خادم الخلفية.
    2. إذا كنت مستخدمًا خاصًا للسحابة الإلكترونية، يمكنك أيضًا تقديم الطلب إلى الخادم الخلفية من أحد معالجي الرسائل.
    3. افحص الاستجابة المُرسَلة من خادم الخلفية وحدِّد القيمة التي تم تمريرها في عنوان الاستجابة Content-Encoding.
    4. حدِّد تنسيق حمولة البيانات المُرسَلة كجزء من الطلب.
    5. إذا كانت قيمة العنوان 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.

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

    للتحقق من صحة استخدام سجلات معالج الرسائل:

    إذا كنت من مستخدمي السحابة الإلكترونية الخاصة، يمكنك استخدام سجلات معالج الرسائل لتحديد المعلومات الأساسية حول أخطاء 502 في HTTP.

    1. التحقق من سجل معالج الرسائل:

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

    2. ابحث عن أي أخطاء 502 خلال مدة محددة (إذا كانت المشكلة قد حدثت في السابق) أو ما إذا كانت هناك أي استجابات لا تزال يتعذّر إجراؤها مع 502. يمكنك استخدام سلسلة البحث التالية:

      grep -ri "ZipException"
      
    3. ستجد سطورًا من System.log مشابهة لما يلي:

      السيناريو الأول

      السيناريو 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() : Exception
      java.util.zip.ZipException: Not in GZIP format
      occurred 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: عندما تحتوي استجابة واجهة برمجة التطبيقات على العنوان 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 لتطبيقات العملاء.

درجة الدقّة

  1. إذا لم تكن هناك حاجة إلى حمولة الاستجابة المضغوطة في تدفق الخادم الوكيل لواجهة برمجة التطبيقات في Apigee Edge وفي خادم الخلفية، يجب عدم تمرير الرأس Content-Encoding. إذا كانت هناك حاجة لضغط حمولة الاستجابة، انتقِل إلى الخطوة 2.
  2. إذا كانت هناك حاجة إلى ضغط حمولة الاستجابة، تأكَّد من أنّ خادم الخلفية يرسل ما يلي دائمًا:
    • أي من الترميز المتوافق كقيمة للعنوان Content-Encoding في الاستجابة
    • تتطابق حمولة الاستجابة بالتنسيق المتوافق مع Apigee Edge مع تنسيق الترميز المحدّد في عنوان Content-Encoding.
  3. في المثال الذي تمت مناقشته أعلاه، تكون حمولة الاستجابة بتنسيق 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:

إذا كنت من مستخدمي 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