502 Bad Gateway - ResponseWithBody

אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X.
מידע

תיאור הבעיה

אפליקציית הלקוח מקבלת קוד סטטוס של HTTP‏ 502 Bad Gateway עם קוד השגיאה protocol.http.ResponseWithBody כתגובה לקריאות ל-API.

הודעת שגיאה

אפליקציית הלקוח מקבלת את קוד התגובה הבא:

HTTP/1.1 502 Bad Gateway

בנוסף, יכול להיות שתופיע אחת מהודעות השגיאה הבאות:

{
   "fault":{
      "faultstring":"Received 204 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}
{
   "fault":{
      "faultstring":"Received 205 Response with message body",
      "detail":{
         "errorcode":"protocol.http.ResponseWithBody"
      }
   }
}

גורמים אפשריים

השגיאה הזו מתרחשת אם תגובת ה-HTTP משרת ה-Backend אל Apigee Edge היא 204 No Content או 205 Reset Content, אבל היא מכילה את גוף התגובה או אחת או יותר מהכותרות הבאות:

  • Content-Length
  • Content-Encoding
  • Transfer-Encoding

בהתאם למפרטים RFC 7231, סעיף 6.3.5: 204 No Content ו- RFC 7231, סעיף 6.3.6: 205 Reset Content, השרת המקורי לא אמור לשלוח תוכן נוסף כחלק מגוף מטען התגובה עם קוד הסטטוס 204 No Content או 205 Reset Content. כותרות התגובה, כמו Content-Length, Content-Encoding או Transfer-Encoding, מציינות את הגודל, הסוג או הפורמט של מטען הייעודי (payload) של התגובה.

לכן, Apigee Edge מחזיר קוד סטטוס 502 Bad Gateway עם קוד השגיאה protocol.http.ResponseWithBody ללקוח בנסיבות הבאות:

קוד סטטוס משרת הקצה העורפי
התגובה משרת הקצה העורפי מכילה ‫‎204 No Content ‫205 Reset Content
גוף התגובה שגיאה שגיאה

כותרת Content-Length

(מוגדר כערך שאינו אפס)

שגיאה שגיאה

Content-Encoding

(מוגדר לערך supported encoding in Apigee Edge)

שגיאה אין שגיאה
Transfer-Encoding שגיאה שגיאה

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

סיבה תיאור הוראות לפתרון בעיות שרלוונטיות ל
גוף התגובה או הכותרות עם תגובה 204 משרת הקצה העורפי שרת הקצה העורפי שולח תגובה מסוג 204 No Content או 205 Reset Content עם גוף תגובה ו/או אחת או יותר מהכותרות Content-Type, Content-Encoding או Transfer-Encoding. משתמשים ב-Edge Public Cloud וב-Edge Private Cloud

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

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

API Monitoring

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

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

  3. עוברים לדף Analyze > API Monitoring > Investigate.
  4. בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
  5. משרטטים את קוד התקלה מול הזמן.
  6. בוחרים תא עם קוד השגיאה protocol.http.ResponseWithBody כמו בדוגמה הבאה:

    ( הגדלת התמונה)

  7. יוצג מידע על קוד התקלה protocol.http.ResponseWithBody כמו בדוגמה הבאה:

    ( הגדלת התמונה)

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

    ( הגדלת התמונה)

  9. בחלון יומנים, רושמים את הפרטים הבאים:
    • קוד סטטוס: 502
    • מקור התקלה: target
    • קוד שגיאה: protocol.http.ResponseWithBody.
  10. אם הערך של Fault Source הוא target והערך של Fault Code הוא protocol.http.ResponseWithBody, המשמעות היא שהשגיאה התרחשה כי שרת הקצה העורפי שלח קוד סטטוס 204 No Content או 205 Reset Content עם גוף התגובה או עם אחת מהכותרות שמוזכרות בקטע Possible causes.

כלי המעקב

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

  1. מפעילים את trace session (מעקב אחר סשן) ואחת מהאפשרויות הבאות:
    1. מחכים שהשגיאה 502 Bad Gateway תתרחש. או
    2. אם אתם מצליחים לשחזר את הבעיה, מבצעים את קריאה ל-API ומשחזרים את השגיאה 502 Bad Gateway.
  2. מוודאים שהאפשרות הצגת כל פרטי הזרימה מופעלת:

  3. בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
  4. אפשר לנווט בין השלבים השונים של ה-trace ולמצוא את המקום שבו התרחשה השגיאה.
  5. בדרך כלל השגיאה מופיעה בflowinfo Error מיד אחרי השלב Request sent to target server, כמו שמוצג כאן:

    תרחיש #1

    תרחיש מספר 1: שרת הקצה העורפי מגיב עם קוד סטטוס 204 No Content שמכיל את גוף התגובה ו/או אחת מהכותרות שמפורטות בסיבות אפשריות.

    שימו לב לערכים הבאים מהמעקב:

    • שגיאה: Received 204 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway

    תרחיש מספר 2

    תרחיש מספר 2: שרת הקצה העורפי מגיב עם קוד סטטוס 204 No Content שמכיל את גוף התגובה או אחת מהכותרות שמפורטות בסיבות אפשריות.

    שימו לב לערכים הבאים מהמעקב:

    • שגיאה: Received 205 Response with message body
    • error.class: com.apigee.rest.framework.BadGateway
  6. עוברים לשלב AX (נתוני Analytics שתועדו) במעקב ולוחצים עליו.
  7. גוללים למטה לקטע Phase Details (פרטי השלב) או Error Headers (כותרות שגיאה) וקובעים את הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source, כמו שמוצג בהמשך:

    ( הגדלת התמונה)

  8. שימו לב לערכים של X-Apigee-fault-code ו-X-Apigee-fault-source are protocol.http.ResponseWithBody ו-target בהתאמה. השגיאה הזו מציינת שהיא התרחשה כי שרת הקצה העורפי שלח קוד סטטוס 204 No Content או 205 Reset Content עם גוף התגובה או אחת מהכותרות שמוזכרות בגורמים אפשריים.
    שגיאה ערך
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target

NGINX

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

  1. אם אתם משתמשי Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי HTTP 502 Bad Gateway.
  2. בודקים את יומני הגישה של NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    איפה: הערכים ORG,‏ ENV ו-PORT# מוחלפים בערכים בפועל.

  3. מחפשים שגיאות 502 עם קוד השגיאה protocol.http.ResponseWithBody במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם 502.
  4. אם מופיעות שגיאות 502 עם הערך protocol.http.ResponseWithBody של X-Apigee-fault-code, צריך לקבוע את הערך של X-Apigee-fault-source.

    דוגמה לשגיאה 502 מיומן הגישה של NGINX:

    בדוגמה שלמעלה מיומן הגישה של NGINX, הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source הם:

    כותרות תגובה ערך
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target
  5. שימו לב שהערכים של X-Apigee-fault-code ו-X-Apigee-fault-source הם protocol.http.ResponseWithBody ו-target בהתאמה. השגיאה הזו מציינת שהיא התרחשה כי שרת הקצה העורפי שלח קוד סטטוס 204 No Content או 205 Reset Content עם גוף התגובה או אחת מהכותרות שמוזכרות בגורמים אפשריים.

הסיבה: גוף התגובה או הכותרות עם תגובה 204 משרת הקצה העורפי

אבחון

  1. כדי לקבוע את קוד השגיאה ואת מקור השגיאה של השגיאה שנצפתה, אפשר להשתמש בכלי 'מעקב אחר קריאות ל-API', בכלי 'מעקב' או ביומני הגישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון.
  2. אם קוד השגיאה הוא protocol.http.ResponseWithBody ומקור השגיאה הוא target, זה מצביע על כך שהשרת בקצה העורפי הגיב עם קוד סטטוס 204 No Content או 205 Reset Content עם גוף התגובה או אחת מהכותרות שצוינו בסיבות אפשריות.
  3. כדי לוודא ששרת הקצה העורפי אכן שלח גוף של מטען ייעודי לתגובה או אחת או יותר מהכותרות שמוזכרות בסיבות אפשריות, אפשר לבצע את השלבים הבאים:

    1. אם אתם משתמשים בענן ציבורי, ואם אתם יכולים לשלוח את אותה בקשת API לשרת הקצה העורפי ישירות מכל אחת מהמערכות שלכם.

    2. אם אתם משתמשי Private Cloud, אתם יכולים לשלוח את אותה בקשת API ישירות לשרת העורפי מאחד ממעבדי ההודעות שמשויכים לארגון ולסביבה הספציפיים שבהם נצפתה הכשל.
    3. בודקים את התגובה שהתקבלה משרת הקצה העורפי ומוודאים שהיא מכילה גוף של מטען ייעודי לתגובה ו/או אחת או יותר מהכותרות שצוינו למעלה. אם כן, זו הסיבה לשגיאה הזו.

      דוגמה 1

      דוגמה 1: תגובת שרת בקצה העורפי 204 עם כותרת Content-Encoding

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Encoding: gzip
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      בדוגמה הזו, שרת הקצה העורפי הגיב עם קוד הסטטוס 204 No Content ועם Content-Encoding: gzip

      דוגמה מס' 2

      דוגמה 2: תגובת שרת בקצה העורפי 204 עם כותרת Content-Length

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 204 No Content
      < Content-Length: 48
      < Date: Tue, 31 Jul 2021 21:41:13 GMT
      < Connection: keep-alive
      

      בדוגמה הזו, שרת הקצה העורפי הגיב עם קוד הסטטוס 204 No Content ועם Content-Length: 48

      דוגמה #3

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

      curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
      

      …
      < HTTP/1.1 205 Reset Content
      < Date: Sat, 31 Jul 2021 17:14:09 GMT
      < Content-Length: 12
      < Content-Type: text/plain; charset=utf-8
      <
      * Connection #0 to host X.X.X.X left intact
      This is a sample Response
      

      בדוגמה הזו, שרת הקצה העורפי הגיב עם קוד הסטטוס 205 Reset Content וגוף התגובה This is a sample Response..

    4. בכל הדוגמאות שלמעלה, שרת הקצה העורפי שלח קוד סטטוס 204 No Content או 205 Reset Content עם גוף התגובה או עם אחת מהכותרות שמוזכרות בסיבות אפשריות.
    5. לכן, Apigee Edge שלח קוד סטטוס 502 Bad Gateway עם קוד השגיאה protocol.http.ResponseWithBody.

רזולוציה

מוודאים שהשרת העורפי תמיד פועל בהתאם למפרט RFC 7231, סעיף 6.3.6: 205 Reset Content, כששולחים את התגובה 204 No Content או 205 Reset Content אל Apigee Edge. כלומר, שרת הקצה העורפי אסור לשלוח את הפרטים הבאים כחלק מתגובת 204 No Content או 205 Reset Content:

  1. גוף המטען הייעודי (payload) של התשובה
  2. ואחד מהכותרים הבאים:
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

מפרט

אם שרת הקצה העורפי שולח תגובה עם קוד סטטוס 204 No Content או 205 Reset Content, אבל לא עומד בדרישות של מפרטי ה-RFC הבאים, Apigee Edge מחזיר קוד סטטוס 502 Bad Gateway וקוד השגיאה protocol.http.ResponseWithBody:

מפרט
RFC 7231, section 6.3.5: 204 No Content
RFC 7231, section 6.3.6: 205 Reset Content

נקודות חשובות שכדאי לזכור

הפתרון המומלץ הוא לתקן את שרת הקצה העורפי כך שישלח את קוד הסטטוס 204 No Content ו-205 Reset Content ללא גוף תגובה וללא אף אחד מהכותרות – Content-Length,‏ Content-Encoding ו-Transfer-Encoding – ובהתאם למפרטים RFC 7231, סעיף 6.3.5: 204 No Content ו- RFC 7231, סעיף 6.3.6: 205 Reset Content.

אם עדיין דרושה לך עזרה מצוות התמיכה של Apigee, אפשר לעבור אל איסוף מידע לצורך אבחון.

צריך לאסוף פרטי אבחון

אוספים את נתוני האבחון הבאים ופונים אל התמיכה של Apigee Edge:

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

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

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

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