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.
  • אבל

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

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

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

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

פורמט Unix gzip.

פרטים נוספים זמינים במאמר פורמט RFC1952 GZIP.

קידוד יחיד deflate

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

פרטים נוספים זמינים ב- RFC1950 וב- RFC1951.

קידוד מרובה

קידוד מרובה

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

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

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

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

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

אפשר להשתמש באחד מהכלים/הטכניקות הבאים כדי לאבחן את השגיאה הזו:

מעקב באמצעות API

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

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

  3. עוברים לדף ניתוח > API Monitoring > חקירה.
  4. בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
  5. מוודאים שמסנן שרת ה-Proxy מוגדר לערך הכול.
  6. יש להציב את קוד השגיאה ביחס ל-Time.
  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. אם ב-Fault Source יש את הערך target, המשמעות היא שפורמט המטען הייעודי של התגובה לא התאים ל הקידוד הנתמך שצוין בכותרת התגובה של שרת הקצה העורפי Content-Encoding.

כלי המעקב

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

  1. מפעילים את הפעלת המעקב וגם:
    1. להמתין עד שהשגיאה 502 Bad Gateway תתרחש, או
    2. אם הצלחת לשחזר את הבעיה, יש לבצע את הקריאה ל-API ולשחזר את 502 Bad Gateway.
  2. יש לוודא שהאפשרות Show allflowInfos מופעלת:

  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 במקרה הזה, אבל אפליקציית הלקוח תקבל את התגובה 502 כי השגיאה הוחזרה על ידי Apigee Edge.

  8. מנווטים לשלב התגובה נשלחה ללקוח במעקב ולוחצים עליו.

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

    חשוב לשים לב לפרטים הבאים מהמעקב:

    • קוד סטטוס: 502 Bad Gateway.
    • תוכן השגיאה: {"fault":{"faultstring":"Decompression failure at response","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtResponse"}}}
  9. עוברים לשלב AX (רישום נתונים ב-Analytics) במעקב ולוחצים עליו.

  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.
    כותרות תגובה Value
    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

    כותרות תגובה Value
    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. אם Fault Code הוא 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.

    נתוני מעקב

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

    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. משתמשים בענן פרטי יכולים גם לשלוח את הבקשה לשרת הקצה העורפי מאחד ממעבדי ההודעות.
    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

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

רזולוציה

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

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

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

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