502 Bad Gateway - DecompressionFailureAtResponse

شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید .
اطلاعات

علامت

برنامه‌ی کلاینت، کد وضعیت HTTP 502 Bad Gateway را به همراه کد خطای messaging.adaptors.http.flow.DecompressionFailureAtResponse به عنوان پاسخی به فراخوانی‌های API دریافت می‌کند.

پیام خطا

برنامه‌ی کلاینت کد پاسخ زیر را دریافت می‌کند:

HTTP/1.1 502 Bad Gateway

علاوه بر این، ممکن است پیام خطایی مشابه آنچه در زیر نشان داده شده است را مشاهده کنید:

{
   "fault":{
      "faultstring":"Decompression failure at response",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"
      }
   }
}

علل احتمالی

این خطا فقط در صورتی رخ می‌دهد که:

  • کدگذاری مشخص شده در هدر Content-Encoding پاسخ HTTP (از سرور backend/target) معتبر است و توسط Apigee Edge پشتیبانی می‌شود .
  • اما

  • قالب بار داده ارسالی توسط سرور backend/target به عنوان بخشی از پاسخ HTTP با قالب کدگذاری مشخص شده در هدر Content-Encoding مطابقت ندارد.

دلیل این امر آن است که Apigee Edge نمی‌تواند payload را با استفاده از کدگذاری مشخص‌شده رمزگشایی کند، زیرا فرمت payload با کدگذاری مشخص‌شده در سربرگ Content-Encoding یکسان نیست.

در اینجا چند نمونه از مقادیر پشتیبانی‌شده‌ی Content-Encoding و نحوه‌ی انتظار Apigee Edge از نمایش بار داده در این موارد آورده شده است:

سناریو کدگذاری محتوا نمایش بار مفید
رمزگذاری تکی gzip

فرمت gzip یونیکس.

به فرمت GZIP در RFC1952 مراجعه کنید.

رمزگذاری تکی باد کردن

این فرمت از ساختار zlib با الگوریتم فشرده‌سازی deflate استفاده می‌کند.

به RFC1950 و RFC1951 مراجعه کنید .

رمزگذاری چندگانه

رمزگذاری چندگانه

برای مثال، در مواردی که کدگذاری دو بار انجام می‌شود، می‌تواند به صورت زیر باشد:

  • gzip، کاهش حجم
  • جی‌زیپ، جی‌زیپ
  • باد کردن، gzip
  • باد کردن، خالی کردن از باد
کدگذاری چندگانه به ترتیبی که در هدر نشان داده شده است، روی محموله اعمال می‌شود.

علل احتمالی این خطا به شرح زیر است:

علت توضیحات دستورالعمل‌های عیب‌یابی قابل اجرا برای
قالب بار پاسخ با کدگذاری محتوا مطابقت ندارد قالب بار داده پاسخ ارسال شده توسط سرور backend/target یا کدگذاری نشده است یا با کدگذاری مشخص شده در هدر Content-Encoding مطابقت ندارد. کاربران فضای ابری عمومی و خصوصی Edge

مراحل تشخیص مشترک

برای تشخیص این خطا از یکی از ابزارها/تکنیک‌های زیر استفاده کنید:

نظارت بر API

برای تشخیص خطا با استفاده از مانیتورینگ API:

  1. به عنوان کاربری با نقش کاربری مناسب، وارد Apigee Edge UI شوید .
  2. به سازمانی که می‌خواهید مشکل را در آن بررسی کنید، مراجعه کنید.

  3. به صفحه Analyze > API Monitoring > Investigate بروید.
  4. بازه زمانی خاصی را که در آن خطاها را مشاهده کرده‌اید، انتخاب کنید.
  5. مطمئن شوید که فیلتر پروکسی روی «همه» تنظیم شده است.
  6. رسم کد خطا در مقابل زمان .
  7. سلولی را انتخاب کنید که کد خطای messaging.adaptors.http.flow.DecompressionFailureAtResponse را داشته باشد، همانطور که در زیر نشان داده شده است:

    ( تصویر را بزرگتر ببینید )

  8. اطلاعات مربوط به کد خطا messaging.adaptors.http.flow.DecompressionFailureAtResponse مطابق شکل زیر نمایش داده می‌شود:

    ( تصویر را بزرگتر ببینید )

  9. روی «مشاهده گزارش‌ها» کلیک کنید و ردیفی را که با خطای 502 مواجه شده است، باز کنید.

    ( تصویر را بزرگتر ببینید )

  10. از پنجره Logs ، جزئیات زیر را یادداشت کنید:
    • کد وضعیت: 502
    • منبع خطا: target
    • کد خطا: messaging.adaptors.http.flow.DecompressionFailureAtResponse .
  11. اگر منبع خطا دارای مقدار target باشد، نشان می‌دهد که فرمت بار داده پاسخ با کدگذاری پشتیبانی‌شده مشخص‌شده در هدر پاسخ سرور backend Content-Encoding مطابقت ندارد.

ابزار ردیابی

برای تشخیص خطا با استفاده از ابزار Trace:

  1. جلسه ردیابی را فعال کنید و یکی از موارد زیر را انجام دهید:
    1. منتظر بمانید تا خطای 502 Bad Gateway رخ دهد، یا
    2. اگر می‌توانید مشکل را دوباره ایجاد کنید، فراخوانی API را انجام دهید و خطای 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
    • کلاس خطا: 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 (داده‌های تحلیلی ثبت‌شده) بروید و روی آن کلیک کنید.

  10. به پایین صفحه و بخش Phase Details و Error Headers بروید و مقادیر X-Apigee-fault-code و X-Apigee-fault-source را مطابق شکل زیر تعیین کنید:

    ( تصویر را بزرگتر ببینید )

  11. مقادیر X-Apigee-fault-code و X-Apigee-fault-source را به صورت messaging.adaptors.http.flow.DecompressionFailureAtResponse و target مشاهده خواهید کرد که نشان می‌دهد فرمت payload پاسخ با کدگذاری مشخص شده در هدر Content-Encoding مطابقت ندارد.
    هدرهای پاسخ ارزش
    کد خطای X-Apigee messaging.adaptors.http.flow.DecompressionFailureAtResponse
    منبع گسل X-Apigee target

انجینکس

برای تشخیص خطا با استفاده از گزارش‌های دسترسی 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 را تعیین کنید.

    نمونه خطای ۵۰۲ از لاگ دسترسی NGINX:

    ورودی نمونه بالا از لاگ دسترسی NGINX دارای مقادیر زیر برای X-Apigee-fault-code و X-Apigee-fault-source است:

    هدرهای پاسخ ارزش
    کد خطای X-Apigee messaging.adaptors.http.flow.DecompressionFailureAtResponse
    منبع گسل X-Apigee target

علت: قالب بار پاسخ با کدگذاری محتوا مطابقت ندارد

به طور پیش‌فرض، Apigee Edge همیشه در صورتی که هدر پاسخ Content-Encoding حاوی یک کدگذاری معتبر و پشتیبانی‌شده باشد، payload را از حالت فشرده خارج می‌کند. بنابراین، انتظار می‌رود که قالب payload پاسخ با کدگذاری مشخص‌شده در Content-Encoding هدر پاسخ مطابقت داشته باشد . اگر عدم تطابق وجود داشته باشد، این خطا را دریافت می‌کنید.

تشخیص

  1. کد خطا و منبع خطا را برای خطای مشاهده شده با استفاده از API Monitoring، ابزار Trace یا گزارش‌های دسترسی NGINX، همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید.
  2. اگر کد خطا messaging.adaptors.http.flow.DecompressionFailureAtResponse باشد و منبع خطا مقدار target داشته باشد، این نشان می‌دهد که قالب بار داده پاسخ ارسال شده توسط سرور backend/target با کدگذاری پشتیبانی شده مشخص شده در هدر پاسخ Content-Encoding مطابقت ندارد.
  3. شما می‌توانید عدم تطابق را به عنوان بخشی از پاسخ HTTP با استفاده از یکی از روش‌های زیر تعیین کنید:

    پیام خطا

    برای اعتبارسنجی با استفاده از پیام خطا:

    1. اگر به پیام خطای کامل دریافتی از Apigee Edge دسترسی دارید، به faultstring مراجعه کنید.

      نمونه پیام خطا:

      "faultstring":"Decompression failure at response"
    2. در پیام خطای بالا، عبارت "Decompression failure at response" نمایش داده می‌شود که به این معنی است که پاسخ نمی‌تواند با استفاده از کدگذاری مشخص شده در سربرگ Content-Encoding از حالت فشرده خارج شود.

    ردیابی

    برای اعتبارسنجی با استفاده از Trace:

    1. همانطور که در مراحل تشخیص مشترک توضیح داده شده است، با استفاده از Trace، نوع محتوا ( Content-Type) و علت خطا (error.cause) را تعیین کنید.
    2. مقادیر حاصل از ردیابی نمونه به شرح زیر است:

      • رمزگذاری محتوا: gzip
      • error.cause: Not in GZIP format

      مقدار موجود در هدر پاسخ Content-Encoding برابر با gzip است؛ با این حال، payload پاسخ در قالب GZIP نیست (همانطور که با error.cause نشان داده شده است). بنابراین، Apigee Edge با 502 Bad Gateway و کد خطای messaging.adaptors.http.flow.DecompressionFailureAtResponse پاسخ می‌دهد.

    درخواست واقعی

    برای اعتبارسنجی با استفاده از درخواست واقعی:

    اگر به درخواست واقعی ارسال شده به برنامه سرور هدف/بک‌اند دسترسی دارید، مراحل زیر را انجام دهید:

    1. اگر شما یک کاربر ابر عمومی/ابر خصوصی هستید، مستقیماً از خود سرور بک‌اند یا هر دستگاه دیگری که از آنجا مجاز به ارسال درخواست به سرور بک‌اند هستید، درخواستی به سرور بک‌اند ارسال کنید.
    2. اگر شما یک کاربر ابر خصوصی هستید، می‌توانید درخواست را از طریق یکی از پردازنده‌های پیام به سرور backend نیز ارسال کنید.
    3. پاسخ ارسال شده توسط سرور backend را بررسی کنید و مقدار ارسال شده در هدر پاسخ 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 خواهید یافت:

      سناریوی شماره ۱

      سناریوی شماره ۱: وقتی پاسخ API دارای هدر 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 در پیام خطای بالا نشان می‌دهد که payload پاسخ با فرمت GZIP ارسال نمی‌شود، اگرچه Content-Encoding به صورت gzip مشخص شده است. بنابراین، Apigee Edge این استثنا را ایجاد می‌کند و کد وضعیت 502 را با کد خطای messaging.adaptors.http.flow.DecompressionFailureAtResponse به برنامه‌های کلاینت برمی‌گرداند.

      سناریوی شماره ۲

      سناریوی شماره ۲: وقتی پاسخ API دارای هدر 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 در پیام خطای بالا نشان می‌دهند که payload پاسخ با فرمت deflate ارسال نشده و با کدگذاری مشخص شده در هدر Content-Encoding مربوط به deflate مطابقت ندارد. بنابراین، Apigee Edge این استثنا را ایجاد می‌کند و کد وضعیت 502 را با کد خطای messaging.adaptors.http.flow.DecompressionFailureAtResponse به برنامه‌های کلاینت برمی‌گرداند.

وضوح تصویر

  1. اگر در جریان پروکسی API در Apigee Edge و در سرور backend نیازی به فشرده‌سازی payload پاسخ نیست، هدر Content-Encoding را ارسال نکنید . اگر نیاز به فشرده‌سازی payload پاسخ است، به مرحله ۲ بروید.
  2. اگر نیاز به فشرده‌سازی حجم پاسخ وجود دارد، مطمئن شوید که سرور backend همیشه موارد زیر را ارسال می‌کند:
    • هر یک از کدگذاری‌های پشتیبانی‌شده به عنوان مقدار هدر 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 تماس بگیرید:

اگر کاربر فضای ابری عمومی هستید، اطلاعات زیر را ارائه دهید:

  • نام سازمان
  • نام محیط
  • نام پروکسی API
  • دستور curl کامل که برای بازتولید خطای 502 استفاده می‌شود
  • فایل ردیابی برای پاسخ‌های API

اگر کاربر Private Cloud هستید، اطلاعات زیر را ارائه دهید:

  • پیام خطای کامل مشاهده شده برای پاسخ‌های ناموفق
  • نام محیط
  • بسته پروکسی API
  • فایل ردیابی برای پاسخ‌های API
  • گزارش‌های دسترسی 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