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

أنت الآن بصدد الاطّلاع على مستندات 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 gzip

راجِع تنسيق GZIP وفقًا لمعيار RFC1952.

الترميز الفردي deflate

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

راجِع RFC1950 و RFC1951.

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

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

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

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

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

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

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

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

API Monitoring

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

  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. تأكَّد من تفعيل خيار عرض جميع معلومات FlowInfo:

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

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

  6. دوِّن قيم الخصائص من التتبُّع:

    • Content-Encoding: 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. انتقِل للأسفل إلى قسم تفاصيل المرحلة وعناوين الأخطاء، وحدِّد قيمتَي X-Apigee-fault-code وX-Apigee-fault-source كما هو موضّح أدناه:

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

  11. ستظهر لك قيمتا X-Apigee-fault-code وX-Apigee-fault-source على النحو 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. إذا كنت مستخدمًا في 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 تطابق قيمة 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.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. حدِّد Content-Type وerror.cause باستخدام Trace كما هو موضّح في خطوات التشخيص الشائعة.
    2. في ما يلي القيم من التتبُّع النموذجي:

      • 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.

    الطلب الفعلي

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

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

    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.

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

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

    إذا كنت مستخدمًا في Private Cloud، يمكنك استخدام سجلّات &quot;معالج الرسائل&quot; لتحديد المعلومات الأساسية حول أخطاء HTTP 502.

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

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

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

      grep -ri "ZipException"
      
    3. ستجد أسطرًا من 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() : 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

      السيناريو 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:

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

  • اسم المؤسسة
  • اسم البيئة
  • اسم خادم وكيل لواجهة برمجة التطبيقات
  • أمر 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