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 משרת הקצה העורפי ל-Apigee Edge היא 204 No Content או 205 Reset Content, אבל היא מכילה את גוף התגובה ו/או אחת או יותר מהכותרות הבאות:

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

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

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

קוד הסטטוס משרת הקצה העורפי
התשובה משרת הקצה העורפי מכילה 204 ללא תוכן 205 איפוס תוכן
גוף התגובה שגיאה שגיאה

כותרת אחת (Content-Length)

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

שגיאה שגיאה

Content-Encoding

(מוגדר כ- קידוד נתמך ב-Apigee Edge)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

כלי המעקב

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

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

  3. בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
  4. אפשר לנווט בין השלבים השונים של המעקב ולאתר את המיקום שבו אירעה הכשל.
  5. השגיאה תופיע בדרך כלל בשגיאה flowinfo מיד אחרי השלב הבקשה נשלחה לשרת היעד, כפי שמוצג כאן:

    תרחיש מס' 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 עם גוף התגובה ו/או אחת מהכותרות שצוינו בסיבות אפשריות.
    שגיאה Value
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target

NGINX

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

  1. אם אתם משתמשים בענן פרטי, אתם יכולים להשתמש ביומני הגישה של 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 כאשר X-Apigee-fault-code תואם לערך protocol.http.ResponseWithBody, צריך לקבוע את הערך של X-Apigee-fault-source.

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

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

    כותרות תגובה Value
    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. אם Fault Code הוא protocol.http.ResponseWithBody ו-FaultSource יש את הערך target, זה אומר שהשרת העורפי הגיב עם קוד סטטוס 204 No Content או 205 Reset Content עם גוף התגובה ו/או אחת מהכותרות שמופיעות בסיבות אפשריות.
  3. כדי לבדוק אם שרת הקצה העורפי אכן שלח גוף מטען ייעודי (payload) של תגובה ו/או אחת או יותר מהכותרות שצוינו בקטע סיבות אפשריות, אפשר לבצע את השלבים הבאים:

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

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

      דוגמה מס' 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

      דוגמה שנייה: תגובה 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.

רזולוציה

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

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

מפרט

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

מפרט
RFC 7231, סעיף 6.3.5: 204 ללא תוכן
RFC 7231, סעיף 6.3.6: 205 איפוס תוכן

נקודות עיקריות שכדאי לשים לב אליהן

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

אם אתם עדיין זקוקים לעזרה מהתמיכה של 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