502 Bad Gateway – ToBigBody

כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של Apigee X.
מידע

תיאור הבעיה

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

הודעת השגיאה

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"Body buffer overflow",
      "detail":{
         "errorcode":"protocol.http.TooBigBody"
      }
   }
}

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

השגיאה הזו מתרחשת אם גודל המטען הייעודי שנשלח על ידי שרת היעד או שרת הקצה העורפי אל Apigee Edge כחלק מתגובת HTTP גדול מהמגבלה המותרת ב-Apigee Edge.

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

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

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

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

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

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

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

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

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

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

  10. בחלון 'יומנים', מעיינים בפרטים הבאים:
    • קוד סטטוס: 502
    • מקור התקלה: target
    • קוד תקלה: protocol.http.TooBigBody.
  11. אם ל-Fault Source יש את הערך target ול-Fault Code יש את הערך protocol.http.TooBigBody, זה אומר שתגובת ה-HTTP משרת היעד/ הקצה העורפי היא מטען ייעודי (payload) גדול יותר מהגודל המותר של המגבלה ב-Apigee Edge.

נתוני מעקב

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

  1. מפעילים את סשן המעקב ומבצעים אחת מהפעולות הבאות:
    • להמתין עד שהשגיאה 502 Bad Gateway תתרחש, או
    • אם אפשר לשחזר את הבעיה, יש לבצע את הקריאה ל-API ולשחזר את השגיאה 502 Bad Gateway.
  2. בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
  3. אפשר לנווט בשלבים השונים של המעקב ולאתר את המיקום שבו אירעה הכשל.
  4. מנווטים לשלב שגיאה מיד אחרי השלב התקבלה תגובה משרת היעד, כמו שמוצג בהמשך:

    שימו לב לערכי השגיאה מתוך המעקב:

    • שגיאה: Body buffer overflow
    • error.class: com.apigee.errors.http.server.BadGateway

    המשמעות היא ש-Apigee Edge (רכיב של מעבד הודעות) מקפיץ את השגיאה ברגע שהוא מקבל את התגובה משרת הקצה העורפי, עקב גודל המטען הייעודי שחורג מהמגבלה המותרת.

  5. אפשר לראות את הכשל בשלב התגובה נשלחה ללקוח באופן הבא:

  6. שימו לב לערכים של השגיאה מתוך המעקב. בדוח לדוגמה שלמעלה מוצגים הפרטים הבאים:
    • שגיאה: 502 Bad Gateway
    • תוכן השגיאה: {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
  7. עוברים לשלב תגובה שהתקבלה משרת היעד כפי שמוצג למטה, בתרחישים שונים:

    לא דחוס

    תרחיש מס' 1: מטען ייעודי (payload) של תגובה נשלח בצורה לא דחוסה

    שימו לב לערכי השגיאה מתוך המעקב:

    • התקבלה תגובה משרת היעד: 200 OK
    • Content-Length (בקטע Content-Length): 11MB~

    דחוס

    תרחיש מס' 2: בקשת מטען ייעודי (payload) שנשלח בפורמט דחוס

    שימו לב לערכי השגיאה מתוך המעקב:

    • התקבלה תגובה משרת היעד: 200 OK
    • Content-Encoding: אם הכותרת הזו מופיעה בקטע כותרות תגובה, חשוב לשים לב לערך. לדוגמה, בדוגמה הזו הערך הוא gzip.
  8. שים לב לגוף ההודעה בקטע תוכן תגובה:

    {"fault":{"faultstring":"Body buffer overflow","detail":{"errorcode":"protocol.http.TooBigBody"}}}
    
  9. עוברים לשלב AX (רישום נתונים ב-Analytics) במעקב ולוחצים עליו כדי לראות את הפרטים הקשורים.

  10. גוללים למטה בקטע שלב הפרטים לקטע קריאת משתנים ומוצאים את הערכים של target.received.content.length, שמציין:
    • הגודל בפועל של המטען הייעודי (payload) של התגובה כאשר הוא נשלח בפורמט לא דחוס
    • הגודל של המטען הייעודי (payload) של התגובה בזמן ביטול הדחיסה על ידי Apigee, כאשר המטען הייעודי נשלח בפורמט דחוס. הערך תמיד יהיה זהה לערך של המגבלה המותרת (10MB) בתרחיש הזה.

    לא דחוס

    תרחיש מס' 1: מטען ייעודי (payload) של תגובה נשלח בצורה לא דחוסה

    שימו לב לערך של target.received.content.length:

    כותרות של בקשות Value
    target.received.content.length כ-11MB

    דחוס

    תרחיש מס' 2: בקשת מטען ייעודי (payload) שנשלח בפורמט דחוס

    שימו לב לערך של target.received.content.length:

    כותרות הבקשה Value
    target.received.content.length כ-10MB
  11. בטבלה הבאה מוסבר למה השגיאה 502 מוחזרת על ידי Apigee בשני התרחישים, שמבוססים על הערך של target.received.content.length:

    תרחיש הערך של target.received.content.length הסיבה לכשל
    מטען ייעודי (payload) של תגובה בפורמט לא דחוס כ-11MB גודל > המגבלה המותרת של 10MB
    מטען ייעודי (payload) של תגובה בפורמט דחוס כ-10MB

    חרגת ממגבלת הגודל בזמן ביטול הדחיסה

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 שתואם לערך protocol.http.TooBigBody, קובעים את הערך של X-Apigee-fault-source.

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

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

    כותרות תגובה Value
    X-Apigee-fault-code protocol.http.TooBigBody
    X-Apigee-fault-source target

הסיבה: הגודל של המטען הייעודי (payload) של התגובה חורג מהמגבלה המותרת

אבחון

  1. קובעים את קוד ה-Fault, מקור התקלה והגודל של המטען הייעודי (payload) של התגובה כדי לזהות את השגיאה שנצפתה באמצעות מעקב API, הכלי למעקב או יומני גישה של NGINX, כמו שמוסבר בשלבי האבחון הנפוצים בתרחיש מס' 1.
  2. אם ב-Fault Source יש את הערך target, המשמעות היא שגודל המטען הייעודי (payload) של התגובה שנשלח אל Apigee גדול מהמגבלה מהמותר ב-Apigee Edge.
  3. מאמתים את גודל המטען הייעודי של התגובה כפי שנקבע בשלב 1.
  4. כדי לוודא שגודל המטען הייעודי (payload) של התגובה גדול מההגבלה המותרת של 10MB, בדקו את התגובה בפועל באמצעות השלבים הבאים:
    1. אם אין לכם גישה לבקשה שנשלחה בפועל לשרת היעד או לשרת הקצה העורפי, עוברים אל פתרון.
    2. אם יש לכם גישה לבקשה שנשלחה בפועל לשרת היעד או לשרת הקצה העורפי, עליכם לבצע את השלבים הבאים:
      1. אם אתם משתמשים בענן ציבורי או בענן פרטי, עליכם לשלוח בקשה ישירות לשרת הקצה העורפי עצמו או מכל מכונה אחרת שממנה יש לכם הרשאה לשלוח את הבקשה לשרת הקצה העורפי.
      2. משתמשים בענן פרטי יכולים גם לשלוח בקשה לשרת הקצה העורפי מאחד ממעבדי ההודעות.
      3. מאמתים את הגודל של המטען הייעודי (payload) שמועבר בתגובה על ידי בדיקת הכותרת Content-Length.
      4. אם גודל המטען הייעודי חורג מהמגבלה המותרת ב-Apigee Edge, זו הסיבה לבעיה.

    תגובה לדוגמה מהשרת העורפי:

    curl -v https://BACKENDSERVER-HOSTNAME/testfile
    
    * About to connect() to 10.14.0.10 port 9000 (#0)
    *   Trying 10.14.0.10...
    * Connected to 10.14.0.10 (10.148.0.10) port 9000 (#0)
    > GET /testfile HTTP/1.1
    > User-Agent: curl/7.29.0
    > Host: 10.14.0.10:9000
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Accept-Ranges: bytes
    < Content-Length: 11534336
    < Content-Type: application/octet-stream
    < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT
    < Date: Wed, 30 Jun 2021 09:22:41 GMT
    <
    ----snipped----
    <Response Body>
    

    בדוגמה שלמעלה אפשר לראות ש-Content-Length: 11534336 (which is ~11 MB) הוא הגורם לשגיאה הזו, כי הוא חורג מ המגבלה המותרת ב-Apigee Edge.

רזולוציה

למידע נוסף, אפשר לקרוא על פתרון.

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

אם המטען הייעודי (payload) של התגובה נשלח בפורמט דחוס וכותרת התגובה Content-Encoding מוגדרת כ-gzip, Apigee מבטל את הדחיסה של המטען הייעודי (payload) של התגובה. במהלך תהליך החילוץ, אם Apigee מזהה שגודל המטען הייעודי גדול מה מגבלה המותרת ב-Apigee Edge, היא מפסיקה את ביטול הדחיסה ומגיבה בחזרה באופן מיידי עם 502 Bad Gateway וקוד השגיאה protocol.http.TooBigBody.

אבחון

  1. קובעים את קוד התקלה, מקור השגיאה והגודל של המטען הייעודי (payload) של התגובה עבור השגיאה שזוהתה באמצעות יומני API Monitoring, הכלי למעקב או יומני גישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון בתרחיש מס' 2.
  2. אם ב-Fault Source יש את הערך target, המשמעות היא שגודל המטען הייעודי (payload) של התגובה שאפליקציית היעד או הקצה העורפי שנשלח אל Apigee גדול מהמגבלה המותרת ב-Apigee Edge.
  3. מאמתים את גודל המטען הייעודי של התגובה כפי שנקבע בשלב 1.
    • אם גודל המטען הייעודי גדול מ-10MB המותר, זו הסיבה לשגיאה.
    • אם גודל המטען הייעודי הוא כ-10MB, יכול להיות שהמטען הייעודי (payload) של התגובה מועבר בפורמט דחוס. במקרה כזה, צריך לבדוק את הגודל הלא דחוס של המטען הייעודי (payload) של התגובה הדחוסה.
  4. אפשר לבדוק אם התגובה מהיעד או מהקצה העורפי נשלחה בפורמט דחוס והגודל הלא דחוס היה גדול מהמגבלה המותרת באחת מהשיטות הבאות:

    נתוני מעקב

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

    1. אם תיעדתם נתוני מעקב לבקשה שנכשלה, תוכלו להיעזר בשלבים המפורטים במעקב וב
      1. קובעים את הערך של target.received.content.length
      2. מוודאים שהבקשה מהלקוח הכילה את הכותרת Content-Encoding: gzip
    2. אם הערך של target.received.content.length חורג מהמגבלה של 10MB המותרת, ומהכותרת target.received.content.length , זו הסיבה לשגיאה.

    בקשה בפועל

    על סמך הבקשה עצמה:

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

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

        curl -v https://BACKENDSERVER-HOSTNAME/testzippedfile.gz
        
        * About to connect() to 10.1.0.10 port 9000 (#0)
        *   Trying 10.1.0.10...
        * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0)
        > GET /testzippedfile.gz HTTP/1.1
        > User-Agent: curl/7.29.0
        > Host: 10.1.0.10:9000
        > Accept: */*
        >
        < HTTP/1.1 200 OK
        < Accept-Ranges: bytes
        < Content-Encoding: gzip
        < Content-Type: application/x-gzip
        < Last-Modified: Wed, 30 Jun 2021 08:18:02 GMT
        < Testheader: test
        < Date: Wed, 07 Jul 2021 10:14:16 GMT
        < Transfer-Encoding: chunked
        <
        ----snipped----
        <Response Body>
        

        במקרה שלמעלה, הכותרת Content-Encoding: gzip נשלחת והגודל של הקובץ testzippedfile.gz בתגובה קטן מהמגבלה, אבל הגודל של הקובץ הלא דחוס testzippedfile היה בערך 15MB.

    יומנים של מעבד ההודעות

    באמצעות יומנים של מעבד ההודעות:

    1. משתמשים בענן פרטי יכולים להיעזר ביומנים של מעבד ההודעות כדי לזהות את המידע החשוב על שגיאות HTTP מסוג 502.
    2. בדיקת היומנים של מעבד ההודעות

      /opt/apigee/var/log/edge-message-processor/logs/system.log

    3. אפשר לחפש כדי לראות אם יש שגיאות 502 במהלך משך זמן ספציפי (אם הבעיה אירעה בעבר) או אם יש בקשות שעדיין נכשלות עם 502. אפשר להשתמש במחרוזות החיפוש הבאות:

      grep -ri "chunkCount"
      
      grep -ri "BadGateway: Body buffer overflow"
      
    4. יופיעו שורות מ-system.log דומות לאלה שמוצגות בהמשך (TotalRead ו-chunkCount עשויים להשתנות במקרה שלך):
      2021-07-07 09:40:47,012  NIOThread@7 ERROR HTTP.SERVICE -
      TrackingInputChannel.checkMessageBodyTooLarge() : Message is too large.
      TotalRead 10489856 chunkCount 2571
      
      2021-07-07 09:40:47,012  NIOThread@7 ERROR HTTP.CLIENT -
      HTTPClient$Context.onInputException() :
      ClientInputChannel(ClientChannel[Connected:
      Remote:10.148.0.10:9000 Local:10.148.0.9:42240]@9155
      useCount=1 bytesRead=0 bytesWritten=182 age=23ms  lastIO=0ms
      isOpen=true).onExceptionRead exception: {}
      com.apigee.errors.http.server.BadGateway: Body buffer overflow
      
      2021-07-07 09:40:47,012  NIOThread@7 ERROR
      ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() :
      AbstractResponseListener.onError(HTTPResponse@77cbd7c4,
      Body buffer overflow)
      
    5. במהלך ביטול הדחיסה, ברגע שמעבד ההודעות קובע שסך כל הבייטים שנקראו גדול מ-10MB, הוא מפסיק ומדפיס את השורה הבאה:

      Message is too large. TotalRead 10489856 chunkCount 2571

      ניתן להסיק שגודל המטען הייעודי של התגובה גדול מ-10MB ו-Apigee מציג את הודעת השגיאה כשהגודל מתחיל לחרוג מהמגבלה של 10MB עם קוד שגיאה כמו protocol.http.TooBigBody

רזולוציה

תיקון הגודל

אפשרות מס' 1 [מומלץ]: תיקון האפליקציה של שרת היעד כך שגודל המטען הייעודי (payload) יחרוג ממגבלת Apigee

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

תבנית URL חתומה

אפשרות מס' 2 [מומלץ]: שימוש בדפוס כתובות URL חתומות בתוך Apigee JavaCallout

עבור מטענים ייעודיים (payloads) בנפח של יותר מ-10MB, ההמלצה של Apigee היא להשתמש בדפוס כתובת URL חתום בתוך Apigee JavaCallout, כפי שמתואר בדוגמה Edge Callout: Signed URL Generator ב-GitHub.

סטרימינג

אפשרות מס' 3: שימוש בסטרימינג

אם שרת ה-API של ה-API צריך לטפל בבקשות גדולות מאוד ו/או בתגובות גדולות מאוד, אפשר להפעיל סטרימינג ב-Apigee.

CwC

אפשרות מס' 4: שימוש בנכס CwC כדי להגדיל את מגבלת מאגר הנתונים הזמני

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

Apigee מספק מאפיין ל- CwC שמאפשר להגדיל את מגבלת הגודל של המטען הייעודי (payload) של בקשות ושל בקשות תגובה. לפרטים נוספים, אפשר לקרוא את המאמר הגדרת מגבלת גודל ההודעות בנתב או במעבד ההודעות.

מגבלות

Apigee מצפה שאפליקציית הלקוח ושרת הקצה העורפי לא ישלחו מטענים ייעודיים שגדולים מהמגבלה המותרת, כפי שמצוין עבור Request/response size ב- Apigee Edge Limits.

  1. אם אתם משתמשים ב-Public Cloud, המגבלה המקסימלית של גודל המטען הייעודי (payload) של בקשות ושל תגובה היא כפי שמתועד עבור Request/response size בהגבלות Apigee Edge.
  2. אם אתם משתמשים בענן פרטי , יכול להיות ששיניתם את המגבלה המקסימלית שמוגדרת כברירת מחדל לגודל של המטען הייעודי (payload) של בקשות ושל בקשות תגובה (למרות שזו לא שיטה מומלצת). אפשר לבדוק מה מגבלת הגודל של המטען הייעודי (payload) המקסימלי של בקשות בעזרת ההוראות במאמר איך בודקים את המגבלה הנוכחית.

איך בודקים את המגבלה הנוכחית?

בקטע הזה מוסבר איך לוודא שהמאפיין HTTPResponse.body.buffer.limit עודכן עם ערך חדש במעבדי ההודעות.

  1. במחשב, מחפשים את המאפיין HTTPResponse.body.buffer.limit בספרייה /opt/apigee/edge-message- processor/conf ובודקים איזה ערך הוגדר:

    grep -ri "HTTPResponse.body.buffer.limit" /opt/apigee/edge-message-processor/conf
    
  2. זוהי התוצאה לדוגמה מהפקודה שלמעלה:

    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.body.buffer.limit=10m
    
  3. בפלט לדוגמה שלמעלה, שימו לב שהמאפיין HTTPResponse.body.buffer.limit הוגדר עם הערך 10m ב-http.properties.

    המגבלה של גודל המטען הייעודי (payload) של הבקשה שהוגדרה ב-Apigee לענן הפרטי היא 10MB.

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

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

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

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

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

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

  • זוהתה הודעת שגיאה מלאה בבקשות שנכשלו
  • שם הארגון
  • שם הסביבה
  • חבילת שרת proxy ל-API
  • קובץ מעקב לבקשות API שנכשלו
  • השלמה של פקודת curl המשמשת לשחזור השגיאה 502
  • יש להשלים את הפלט של התגובה משרת היעד/הקצה העורפי, יחד עם גודל המטען הייעודי (payload)
  • יומני הגישה של 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