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"
      }
   }
}

علل احتمالی

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

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

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

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

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

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

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

فرمت RFC1952 GZIP را ببینید.

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

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

RFC1950 و RFC1951 را ببینید .

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

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

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

  • gzip، باد کردن
  • gzip، gzip
  • باد کردن، gzip
  • باد کردن، باد کردن
کدگذاری چندگانه بر روی محموله به ترتیب داده شده همانطور که در هدر ظاهر می شود اعمال می شود.

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

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

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

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

مانیتورینگ API

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

  1. به عنوان کاربر با نقش مناسب وارد رابط کاربری Apigee Edge شوید .
  2. به سازمانی که می‌خواهید در آن موضوع را بررسی کنید بروید.

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

    ( مشاهده تصویر بزرگتر )

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

    ( مشاهده تصویر بزرگتر )

  9. روی View logs کلیک کنید و ردیف با خطای 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. اطمینان حاصل کنید که نمایش همه FlowInfos فعال است:

  3. یکی از پاسخ های ناموفق را انتخاب کنید و ردیابی را بررسی کنید.
  4. در مراحل مختلف ردیابی پیمایش کنید و محل وقوع شکست را پیدا کنید.
  5. شما معمولاً همانگونه که در زیر نشان داده شده است، خطا را در یک جریان درست بعد از مرحله Response Received from target server پیدا خواهید کرد:

    ( مشاهده تصویر بزرگتر )

  6. به مقادیر خصوصیات از trace توجه کنید:

    • رمزگذاری محتوا: 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 Decompression failure at response شده است (در مرحله قبل تعیین شد).

    توجه داشته باشید که در این مورد، پاسخ سرور هدف/بک‌اند 200 است. با این حال، برنامه مشتری پاسخ 502 را دریافت می کند زیرا خطا توسط Apigee Edge برگردانده شده است.

  8. به مرحله Response Sent to Client در Trace بروید و روی آن کلیک کنید.

    ( مشاهده تصویر بزرگتر )

    به جزئیات زیر از ردیابی توجه کنید:

    • کد وضعیت: 502 Bad Gateway .
    • محتوای خطا: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. به مرحله AX (Analytics Data Recorded) در Trace بروید و روی آن کلیک کنید.

  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 خواهید دید، که نشان می‌دهد قالب بار پاسخ با کدگذاری مشخص‌شده در Content-Encoding مطابقت ندارد. هدر 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. کد خطا و منبع خطا را برای خطای مشاهده شده با استفاده از مانیتورینگ API، ابزار Trace، یا گزارش های دسترسی 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. اگر کاربر عمومی Cloud/Private Cloud هستید، مستقیماً از سرور باطن یا هر دستگاه دیگری که از آنجا مجاز به ارائه درخواست به سرور باطن هستید، به سرور باطن درخواست دهید.
    2. اگر کاربر Private 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 به عنوان یک فایل فشرده ارسال می شود. بنابراین، این پاسخ با یک خطای 502 Bad Gateway با کد خطا: messaging.adaptors.http.flow.DecompressionFailureAtResponse با شکست مواجه می شود.

    گزارش های پردازشگر پیام

    برای تأیید اعتبار با استفاده از گزارش‌های پردازشگر پیام:

    اگر کاربر Private Cloud هستید، می‌توانید از گزارش‌های پردازشگر پیام برای تعیین اطلاعات کلیدی درباره خطاهای HTTP 502 استفاده کنید.

    1. گزارش پردازشگر پیام را بررسی کنید:

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

    2. جستجو کنید تا ببینید آیا خطاهای 502 در طول یک مدت زمان مشخص وجود دارد (اگر مشکل در گذشته اتفاق افتاده است) یا آیا پاسخ هایی وجود دارد که هنوز با 502 ناموفق هستند. می توانید از رشته جستجوی زیر استفاده کنید:

      grep -ri "ZipException"
      
    3. خطوطی را از system.log مشابه موارد زیر خواهید یافت:

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

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

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

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

قطعنامه

  1. اگر نیازی به بار پاسخ فشرده در جریان پراکسی API در 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 نیاز دارید، به Must collect information diagnostic بروید.

باید اطلاعات تشخیصی را جمع آوری کرد

اطلاعات تشخیصی زیر را جمع آوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید:

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

  • نام سازمان
  • نام محیط زیست
  • نام پروکسی 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