شما در حال مشاهده اسناد 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 | فرمت یونیکس فرمت RFC1952 GZIP را ببینید. |
رمزگذاری منفرد | باد کردن | این فرمت از ساختار |
رمزگذاری چندگانه | رمزگذاری چندگانه به عنوان مثال، در مواردی که رمزگذاری دو بار انجام می شود، می تواند به صورت زیر باشد:
| کدگذاری چندگانه بر روی محموله به ترتیب داده شده همانطور که در هدر ظاهر می شود اعمال می شود. |
دلایل احتمالی این خطا به شرح زیر است:
علت | توضیحات | دستورالعمل های عیب یابی قابل اجرا برای |
---|---|---|
قالب بارگیری پاسخ با Content-Encoding مطابقت ندارد | قالب بار پاسخ ارسال شده توسط سرور باطن/هدف یا کدگذاری نشده است یا با کدگذاری مشخص شده در سربرگ Content-Encoding مطابقت ندارد. | کاربران Edge Public و Private Cloud |
مراحل تشخیص رایج
برای تشخیص این خطا از یکی از ابزارها/تکنیک های زیر استفاده کنید:
مانیتورینگ API
برای تشخیص خطا با استفاده از API Monitoring:
- به عنوان کاربر با نقش مناسب وارد رابط کاربری Apigee Edge شوید .
به سازمانی که میخواهید در آن موضوع را بررسی کنید بروید.
- به صفحه Analyze > API Monitoring > Investigate بروید.
- بازه زمانی خاصی را که در آن خطاها را مشاهده کرده اید انتخاب کنید.
- مطمئن شوید که فیلتر پروکسی روی همه تنظیم شده باشد.
- کد خطا را در برابر زمان ترسیم کنید.
سلولی را انتخاب کنید که دارای کد خطای
messaging.adaptors.http.flow.DecompressionFailureAtResponse
است، همانطور که در زیر نشان داده شده است:اطلاعات مربوط به کد خطا
messaging.adaptors.http.flow.DecompressionFailureAtResponse
مطابق شکل زیر نمایش داده می شود:روی View logs کلیک کنید و ردیف با خطای
502
را بزرگ کنید.- از پنجره Logs به جزئیات زیر توجه کنید:
- کد وضعیت:
502
- منبع خطا:
target
- کد خطا:
messaging.adaptors.http.flow.DecompressionFailureAtResponse
.
- کد وضعیت:
- اگر منبع خطا دارای مقدار
target
باشد، این نشان میدهد که قالب بار پاسخ با کدگذاری پشتیبانیشده مشخصشده در سرصفحه پاسخ سرور BackendContent-Encoding
مطابقت ندارد.
ابزار ردیابی
برای تشخیص خطا با استفاده از ابزار Trace:
- جلسه ردیابی را فعال کنید و یا:
- صبر کنید تا خطای
502 Bad Gateway
رخ دهد یا - اگر میتوانید مشکل را تکرار کنید، با API تماس بگیرید و
502 Bad Gateway
را بازتولید کنید.
- صبر کنید تا خطای
اطمینان حاصل کنید که نمایش همه FlowInfos فعال است:
- یکی از پاسخ های ناموفق را انتخاب کنید و ردیابی را بررسی کنید.
- در مراحل مختلف ردیابی پیمایش کنید و محل وقوع شکست را پیدا کنید.
شما معمولاً همانگونه که در زیر نشان داده شده است، خطا را در یک جریان درست بعد از مرحله Response Received from target server پیدا خواهید کرد:
به مقادیر خصوصیات از trace توجه کنید:
- رمزگذاری محتوا:
gzip
- بدنه محتوای پاسخ:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- رمزگذاری محتوا:
بلافاصله پس از مرحله پاسخ دریافت شده از سرور مورد نظر به مرحله خطا بروید:
به خواص توجه کنید:
- خطا:
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 برگردانده شده است.- خطا:
به مرحله Response Sent to Client در Trace بروید و روی آن کلیک کنید.
به جزئیات زیر از ردیابی توجه کنید:
- کد وضعیت:
502 Bad Gateway
. - محتوای خطا:
{"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
- کد وضعیت:
به مرحله AX (Analytics Data Recorded) در Trace بروید و روی آن کلیک کنید.
- به قسمت Phase Details ، Error Headers بروید و مقادیر X-Apigee-fault-code و X-Apigee-fault-source را مطابق شکل زیر تعیین کنید:
- مقادیر 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:
- اگر کاربر Private Cloud هستید، می توانید از گزارش های دسترسی NGINX برای تعیین اطلاعات کلیدی مربوط به خطاهای HTTP
502
استفاده کنید. گزارش های دسترسی NGINX را بررسی کنید:
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log
جایی که: ORG ، ENV ، و PORT# با مقادیر واقعی جایگزین میشوند.
- جستجو کنید تا ببینید آیا خطاهای
502
در طول یک مدت زمان مشخص وجود دارد (اگر مشکل در گذشته اتفاق افتاده است) یا آیا پاسخ هایی وجود دارد که هنوز با502
ناموفق هستند. اگر هر گونه خطای
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
مطابقت داشته باشد. اگر عدم تطابق وجود داشته باشد، این خطا را دریافت می کنید.
تشخیص
- کد خطا و منبع خطا را برای خطای مشاهده شده با استفاده از مانیتورینگ API، ابزار Trace، یا گزارش های دسترسی NGINX همانطور که در مراحل تشخیص رایج توضیح داده شده است، تعیین کنید.
- اگر کد خطا
messaging.adaptors.http.flow.DecompressionFailureAtResponse
باشد و منبع خطا دارای مقدارtarget
باشد، این نشان می دهد که قالب بار پاسخ ارسال شده توسط سرور باطن/هدف با رمزگذاری پشتیبانی شده مشخص شده در پاسخ مطابقت ندارد. هدرContent-Encoding
. با استفاده از یکی از روش های زیر می توانید عدم تطابق را به عنوان بخشی از پاسخ HTTP تعیین کنید:
پیغام خطا
برای تأیید اعتبار با استفاده از پیام خطا:
اگر به پیام خطای کامل دریافت شده از Apigee Edge دسترسی دارید، به
faultstring
مراجعه کنید.نمونه پیغام خطا:
"faultstring":"Decompression failure at response"
- در پیغام خطای بالا،
"Decompression failure at response"
نمایش داده می شود که به این معنی است که پاسخ را نمی توان با استفاده از رمزگذاری مشخص شده در هدرContent-Encoding
از حالت فشرده خارج کرد.
ردیابی
برای تأیید اعتبار با استفاده از Trace:
- همانطور که در مراحل تشخیص رایج توضیح داده شده است ، Content-Type و error.cause را با استفاده از Trace تعیین کنید.
مقادیر ردیابی نمونه به شرح زیر است:
- رمزگذاری محتوا:
gzip
- error.cause:
Not in GZIP format
مقدار در هدر پاسخ Content-Encoding gzip است. با این حال، بار پاسخ در قالب GZIP نیست (همانطور که با error.cause نشان داده شده است). بنابراین، Apigee Edge با
502 Bad Gateway
و کد خطاmessaging.adaptors.http.flow.DecompressionFailureAtResponse
پاسخ می دهد.- رمزگذاری محتوا:
درخواست واقعی
برای اعتبارسنجی با استفاده از درخواست واقعی:
اگر به درخواست واقعی ارسال شده به برنامه سرور هدف/بکاند دسترسی دارید، مراحل زیر را انجام دهید:
- اگر کاربر عمومی Cloud/Private Cloud هستید، مستقیماً از سرور باطن یا هر دستگاه دیگری که از آنجا مجاز به ارائه درخواست به سرور باطن هستید، به سرور باطن درخواست دهید.
- اگر کاربر Private Cloud هستید، می توانید از یکی از پردازشگرهای پیام نیز درخواست را به سرور پشتیبان ارسال کنید.
- پاسخ ارسال شده توسط سرور باطن را بررسی کنید و مقدار ارسال شده در هدر پاسخ
Content-Encoding.
- فرمت بار ارسال شده به عنوان بخشی از درخواست را تعیین کنید.
- اگر مقدار هدر
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
استفاده کنید.گزارش پردازشگر پیام را بررسی کنید:
/opt/apigee/var/log/edge-message-processor/logs/system.log
جستجو کنید تا ببینید آیا خطاهای
502
در طول یک مدت زمان مشخص وجود دارد (اگر مشکل در گذشته اتفاق افتاده است) یا آیا پاسخ هایی وجود دارد که هنوز با502
ناموفق هستند. می توانید از رشته جستجوی زیر استفاده کنید:grep -ri "ZipException"
خطوطی را از 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() : Exceptionjava.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
را به برنامههای کلاینت برمیگرداند.
قطعنامه
- اگر نیازی به بار پاسخ فشرده در جریان پراکسی API در Apigee Edge و در سرور باطن نیست، پس از هدر
Content-Encoding
رد نکنید . اگر نیاز به فشرده سازی بار پاسخ وجود دارد، به مرحله 2 بروید. - اگر نیاز به فشرده سازی بار پاسخ وجود دارد، مطمئن شوید که سرور باطن همیشه موارد زیر را ارسال می کند:
- هر یک از کدهای پشتیبانی شده به عنوان مقدار سرصفحه
Content-Encoding
در پاسخ - بار پاسخ در قالب پشتیبانی شده به Apigee Edge با قالب کدگذاری مشخص شده در سربرگ
Content-Encoding
مطابقت دارد.
- هر یک از کدهای پشتیبانی شده به عنوان مقدار سرصفحه
- در مثالی که در بالا توضیح داده شد، بار پاسخ به فرمت 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