502 שער שגוי – ביטול הדחיסהFailureAtResponse

מוצג המסמך של 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,
  • אבל

  • פורמט המטען הייעודי (Payload) שנשלח על ידי שרת הקצה העורפי/היעד כחלק מתגובת HTTP לא להתאים לפורמט הקידוד שצוין בכותרת Content-Encoding

הסיבה לכך היא ש-Apigee Edge לא מצליחה לפענח את המטען הייעודי (payload) באמצעות הקידוד שצוין, של המטען הייעודי (Payload) אינו בפורמט זהה לזה של הקידוד שצוין הכותרת Content-Encoding.

הנה כמה דוגמאות לערכים נתמכים של Content-Encoding ולאופן השימוש ב-Apigee Edge מצפה שהייצוג של המטען הייעודי (Payload) יהיה במקרים האלה:

תרחיש קידוד התוכן ייצוג מטען ייעודי (payload)
קידוד יחיד gzip

פורמט gzip Unix.

צפייה פורמט RFC1952 GZIP.

קידוד יחיד להקטין

בפורמט הזה נעשה שימוש במבנה zlib עם אלגוריתם לדחיסת נתונים.

ראו RFC1950 וגם RFC1951.

קידוד מרובה

קידוד מרובה

לדוגמה, במקרים שבהם הקידוד מתבצע פעמיים, המצב עשוי להיות:

  • gzip, deflate
  • gzip, gzip
  • deflate, gzip
  • להפוך, להקטין, להתרחב
קידודים מרובים הופעלו במטען הייעודי (payload) בסדר הנתון כפי שהוא מופיע בכותרת.

הסיבות האפשריות לשגיאה הזו הן:

סיבה תיאור הוראות לפתרון בעיות עבור
פורמט המטען הייעודי של התשובות לא תואם לקידוד התוכן הפורמט של המטען הייעודי (payload) של התגובה שנשלח על ידי שרת הקצה העורפי/שרת היעד הוא לא מקודד או לא תואם לקידוד שצוין בכותרת Content-Encoding. משתמשי Edge בענן הציבורי והפרטי

שלבי אבחון נפוצים

יש להשתמש באחד מהכלים או השיטות הבאים כדי לאבחן את השגיאה:

מעקב API

כדי לאבחן את השגיאה באמצעות API Monitoring:

  1. נכנסים ל-Apigee Edge UI כמשתמש עם התפקיד המתאים.
  2. עוברים לארגון שבו רוצים לחקור את הבעיה.

  3. מנווטים אל ניתוח > מעקב API > לחקור את הדף.
  4. בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
  5. מוודאים שהמסנן של שרת ה-proxy מוגדר לאפשרות All.
  6. הציגו את קוד התקלה ביחס ל-Time.
  7. צריך לבחור תא עם קוד התקלה messaging.adaptors.http.flow.DecompressionFailureAtResponse בתור מוצגת למטה:

    ( הצגת תמונה גדולה יותר)

  8. מידע על קוד התקלה messaging.adaptors.http.flow.DecompressionFailureAtResponse מוצג כפי שמוצג כאן:

    ( הצגת תמונה גדולה יותר)

  9. לוחצים על הצגת היומנים ומרחיבים את השורה שבה מופיעה השגיאה 502.

    ( הצגת תמונה גדולה יותר)

  10. בחלון יומנים שימו לב לפרטים הבאים:
    • קוד סטטוס: 502
    • מקור התקלה: target
    • קוד התקלה: messaging.adaptors.http.flow.DecompressionFailureAtResponse.
  11. אם ל-Fault Source יש את הערך target, זה מציין שפורמט המטען הייעודי (payload) של התגובה לא התאים קידוד נתמך שמצוין בכותרת התגובה של שרת הקצה העורפי Content-Encoding.

כלי המעקב

כדי לאבחן את השגיאה באמצעות כלי המעקב:

  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
    • error.class: com.apigee.errors.http.server.BadGateway
    • error.cause: Not in GZIP format

      התג error.cause מציין שהמטען הייעודי (payload) של התגובה אינו בפורמט GZIP. המשמעות היא ש-Apigee Edge ציפה שהמטען הייעודי (payload) של התגובה יהיה בפורמט GZIP כ- צוין בכותרת Content-Encoding (נקבע בסעיף הקודם לכן, Apigee Edge לא יכולה לפתוח את המטען הייעודי (payload) באמצעות 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 (Analytics Data Recorded) במעקב ולוחצים עליה.

  10. גוללים למטה לקטע פרטי שלב, כותרות של שגיאות ו לקבוע את הערכים של 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-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-source:

    כותרות של תשובות ערך
    X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtResponse
    X-Apigee-fault-source target

הסיבה: פורמט המטען הייעודי (payload) של התגובה לא תואם לקידוד התוכן

כברירת מחדל, ב-Apigee Edge תמיד מבטל את הדחיסה של המטען הייעודי (payload) אם כותרת התגובה Content-Encoding מכיל ערך תקין של בקידוד נתמך. לכן, צריך לצפות שהפורמט של המטען הייעודי (Payload) של התגובה חייב להיות תואם לקידוד שצוין בכותרת התשובה Content-Encoding. אם יש חוסר התאמה, מקבלים את השגיאה הזו.

אבחון

  1. מגדירים את קוד השגיאה ואת מקור התקלה של השגיאה שזוהתה באמצעות ה-API יומני מעקב, כלי מעקב או NGINX, כפי שמוסבר ב שלבי האבחון הנפוצים.
  2. אם קוד השגיאה הוא messaging.adaptors.http.flow.DecompressionFailureAtResponse וגם ל-Fault Source יש את הערך target, ואז זה מציין שהפורמט של המטען הייעודי (payload) של התגובה שנשלח על ידי שרת הקצה העורפי/שרת היעד לא תואם הקידוד נתמך שמצוין בכותרת התגובה 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; עם זאת, המטען הייעודי (payload) של התגובה הוא לא בפורמט GZIP (כפי שמצוין על ידי error.cause). לכן, Apigee Edge מגיבה 502 Bad Gateway וקוד השגיאה messaging.adaptors.http.flow.DecompressionFailureAtResponse.

    הבקשה בפועל

    כדי לאמת באמצעות הבקשה עצמה:

    אם יש לכם גישה לבקשה שנשלחה בפועל לשרת היעד או לשרת העורפי מבצעים את השלבים הבאים:

    1. אם את/ה משתמש/ת בענן ציבורי/בענן פרטי, עליך להגיש בקשה ישירות לשרת הקצה העורפי משרת הקצה העורפי עצמו או מכל מהמכשיר שממנו מותר לך לשלוח את הבקשה לשרת העורפי.
    2. אם אתם משתמשים ב-Private Cloud, תוכלו גם לשלוח את הבקשה לשרת הקצה העורפי מאחד ממעבדי ההודעות.
    3. בדיקת התגובה שנשלחה על ידי שרת הקצה העורפי וזיהוי הערך הועברה בכותרת התגובה Content-Encoding.
    4. קובעים את הפורמט של המטען הייעודי (Payload) שנשלח כחלק מהבקשה.
    5. אם הערך של הכותרת Content-Encoding נמצא ברשימה של הקידוד נתמך אבל הפורמט של המטען הייעודי (Payload) של התגובה לא תואם לקידוד שצוין בכותרת 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, תוכלו להשתמש ביומני עיבוד ההודעות. כדי לקבוע את המידע העיקרי לגבי שגיאות 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 בהודעת השגיאה שלמעלה, מציין שהמטען הייעודי (payload) של התגובה לא נשלח. הוא לא תואם לקידוד שצוין הכותרת Content-Encoding של deflate. לכן, Apigee Edge זורקת את החריג ומחזירה קוד סטטוס 502 עם קוד השגיאה messaging.adaptors.http.flow.DecompressionFailureAtResponse לאפליקציות לקוח.

רזולוציה

  1. אם אין צורך במטען הייעודי (payload) של התגובה הדחוסה בתהליך ה-Proxy ל-API ב-Apigee Edge ובשרת הקצה העורפי, לא מעבירים את הכותרת Content-Encoding. אם צריך לדחוס את המטען הייעודי (payload) של התגובות, עוברים לשלב 2.
  2. אם צריך לדחוס את המטען הייעודי (payload) של התגובה, צריך לוודא ששרת הקצה העורפי תמיד שולח את הנתונים הבאים:
    • כל אחד מהתנאים הבאים קידוד נתמך כערך של הכותרת Content-Encoding בקידוד תשובה
    • המטען הייעודי (payload) של התגובה בפורמט הנתמך ל-Apigee Edge תואם לקידוד פורמט שצוין בכותרת Content-Encoding
  3. בדוגמה שלמעלה, המטען הייעודי של התשובות הוא בפורמט ZIP אבל כותרת התגובה. מציין את הערך Content-Encoding: gzip. כדי לפתור את הבעיה, אפשר לשלוח את התשובה הכותרת היא Content-Encoding: gzip והמטען הייעודי (payload) של התגובה ב-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:

אם אתם משתמשים ב-Public Cloud, עליכם לספק את הפרטים הבאים:

  • שם הארגון
  • שם הסביבה
  • שם ה-API של ה-Proxy
  • צריך להשלים את הפקודה curl ששימשה לשחזור השגיאה 502
  • קובץ מעקב לתגובות ה-API

אם אתם משתמשים בענן פרטי, עליכם לספק את הפרטים הבאים:

  • הודעת שגיאה מלאה זוהתה לגבי התגובות שנכשלו
  • שם הסביבה
  • חבילת API Proxy
  • קובץ מעקב לתגובות ה-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