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 يجب أن يكون تمثيل حمولة البيانات في الحالات التالية:

السيناريو Content-Encoding تمثيل الحمولة
ترميز فردي برنامج gzip

تنسيق gzip لنظام التشغيل Unix

عرض تنسيق RFC1952 GZIP

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

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

عرض RFC1950 RFC1951.

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

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

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

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

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

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

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

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

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

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

  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. تأكَّد من تفعيل عرض كل 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 بتنسيق GZIP تم تحديده في عنوان Content-Encoding (تم تحديده في السابق خطوة).لذلك، لا تستطيع Apigee Edge فك ضغط الحمولة باستخدام gzip وعرض ملف الخطأ Decompression failure at response.

    يُرجى العلم أنّ الاستجابة من الخادم الهدف/الخلفية هي 200 في هذه case; ومع ذلك، سيتلقى تطبيق العميل رسالة الخطأ 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-code كما هو موضح أدناه:

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

  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 لإجراء ما يلي: لتحديد المعلومات الأساسية حول أخطاء 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-code

    عناوين الردود القيمة
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

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

تقوم 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

    التتبّع

    للتحقّق من الصحة باستخدام Trace، اتّبِع الخطوات التالية:

    1. تحديد Content-Type وerror.cause باستخدام Trace كما هو موضّح في خطوات التشخيص الشائعة.
    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. إذا كنت مستخدمًا خاصًا في Cloud، يمكنك أيضًا تقديم الطلب. إلى خادم الخلفية من أحد معالجات الرسائل.
    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

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

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

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

    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 في رسالة الخطأ أعلاه إلى أن حمولة الاستجابة لم يتم إرسالها ولا يتطابق هذا التنسيق مع الترميز المحدد في ملف تعريف الارتباط موضع الانكماش: Content-Encoding ولذلك، لا شك في أنّ 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 Public، يُرجى تقديم المعلومات التالية:

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