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 אבל הוא מכיל את התגובה body ו/או אחת או יותר מהכותרות הבאות:

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

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

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

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

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

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

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

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

כלי המעקב

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

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

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

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

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

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

      דוגמא מס' 1

      דוגמה ראשונה: תגובת שרת עורפי 204 עם כותרת קידוד תוכן

      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 עם כותרת באורך התוכן

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

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

  • שם הארגון
  • שם הסביבה
  • שם ה-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