502 שער שגוי – ToBigHeaders

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

תיאור הבעיה

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

הודעת שגיאה

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

HTTP/1.1 502 Bad Gateway

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

{
   "fault":{
      "faultstring":"response headers size exceeding 25,600",
      "detail":{
         "errorcode":"protocol.http.TooBigHeaders"
      }
   }
}

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

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

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

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

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

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

API Monitoring

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

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

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

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

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

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

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

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

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

כלי המעקב

  1. מפעילים את trace session (מעקב אחר סשן) ואחת מהאפשרויות הבאות:
    1. ממתינים להתרחשות השגיאה 502 Bad Gateway, או
    2. אם אתם מצליחים לשחזר את הבעיה, מבצעים את קריאה ל-API ומשחזרים את השגיאה 502 Bad Gateway.
  2. בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
  3. אפשר לנווט בין השלבים השונים של ה-trace ולמצוא את המקום שבו התרחשה השגיאה.
  4. בדרך כלל השגיאה הזו מופיעה בתהליך שנקרא Error מיד אחרי השלב Request sent to target server, כמו שמוצג בהמשך:

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

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

    • שגיאה: response headers size exceeding 25,600
    • ‫error.class: com.apigee.errors.http.server.BadGateway

    השגיאה הזו מציינת ש-Apigee Edge (רכיב Message Processor) מחזיר את השגיאה ברגע שהוא מקבל את התגובה משרת הקצה העורפי, כי גודל הכותרת חורג מהמגבלה המותרת.

  5. השגיאה תופיע בתגובה Response Sent to Client שנשלחה על ידי Apigee Edge, כמו שמוצג בהמשך:

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

  6. שימו לב לערכי השגיאה מהמעקב. בדוגמה שלמעלה של נתוני מעקב מוצג:
    • שגיאה: 502 Bad Gateway.
    • תוכן השגיאה: {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
  7. עוברים לשלב AX (Analytics Data Recorded) בנתוני המעקב ולוחצים עליו כדי לראות את הפרטים שקשורים אליו.

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

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

    כותרות שגיאה ערך
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source target
    תוכן השגיאה: גוף {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}

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.TooBigHeaders במהלך פרק זמן ספציפי (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם 502.
  4. אם מופיעות שגיאות 502 עם הערך X-Apigee-fault-code שזהה לערך של protocol.http.TooBigHeaders, צריך לקבוע את הערך של X-Apigee-fault-source.

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

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

    כותרות שגיאה ערך
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source target

הסיבה: גודל הכותרות בתגובה גדול מהמגבלה המותרת

אבחון

  1. כדי לקבוע את קוד השגיאה, מקור השגיאה וגודל מטען התגובה של השגיאה שנצפתה, אפשר להשתמש בכלי API Monitoring, בכלי Trace או ביומני הגישה של NGINX, כמו שמוסבר במאמר שלבים נפוצים לאבחון.
  2. אם הערך של Fault Source הוא target, המשמעות היא שהתשובה שנשלחה משרת היעד או מהשרת העורפי אל Apigee מכילה כותרות שהגודל שלהן גדול יותר מהמגבלה המותרת ב-Apigee Edge.
  3. כדי לוודא שהתגובה מהיעד או מהקצה העורפי כוללת כותרות שהגודל שלהן גדול מהמגבלה המותרת, אפשר להשתמש באחת מהשיטות הבאות:

    הודעת שגיאה

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

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

    הודעת שגיאה לדוגמה:

    "faultstring":"response headers size exceeding 25,600"

    בהודעת השגיאה שלמעלה, שימו לב שבקטע faultstringהתגובה כוללת כותרות שהגודל הכולל שלהן חורג מהמגבלה המותרת.

    הבקשה בפועל

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

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

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

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

      curl -v https://TARGET_SERVER_HOST/test
      
      * 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 /test 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-Length: 0
      < Content-Type: text/plain; charset=utf-8
      < Last-Modified: Tue, 20 Jul 2021 09:23:56 GMT
      < Testheader1: XVlBzgba—-<snipped>---THctcuAx
      < Testheader2: hxKQFDaFpLSj—-<snipped>---FbcXoEFfRsWxP
      < Date: Fri, 23 Jul 2021 09:51:22 GMT
      <
      * Connection #0 to host 10.1.0.10 left intact
      

      בדוגמה שלמעלה, הגדלים של Testheader1 ושל Testheader2 גדולים יותר, וזו הסיבה לשגיאה הזו כי הם חורגים מהמגבלה המותרת ב-Apigee Edge.

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

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

    אם אתם משתמשים ב-Private Cloud, תוכלו להשתמש ביומני Message Processor כדי לוודא שגודל כותרות התגובה לא חרג מהמגבלה המותרת ב-Apigee Edge.

    1. בודקים את היומנים של מעבד ההודעות:

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

    2. מחפשים כדי לראות אם יש 502 שגיאות במהלך משך זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם 502. אפשר להשתמש במחרוזת החיפוש הבאה:
      grep -ri "response headers size exceeding"
      
    3. תוכלו למצוא שורות מ-system.log שדומות לאלה שמופיעות בהמשך. גודל כותרות התגובה עשוי להיות שונה במקרה שלכם:
      2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest rev:1
      messageid:r23ijb1b-1  NIOThread@1 ERROR HTTP.CLIENT -
      HTTPClient$Context$3.onException() :  ClientChannel[Connected:
      Remote:3.7.1.1:9000 Local:192.168.2.1:56098]@8414 useCount=1
      bytesRead=0 bytesWritten=207 age=640ms  lastIO=0ms  isOpen=true.onExceptionRead
      exception: {}
      com.apigee.errors.http.server.BadGateway: response headers size exceeding 25,600
      
      2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest
      rev:1 messageid:r23ijb1b-1  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractResponseListener.onException() : AbstractResponseListener.onError
      (HTTPResponse@31f3ef88, response headers size exceeding 25,600)
    4. ברגע שמעבד ההודעות מקבל את התגובה מהשרת העורפי או מהשרת היעד, ומגלה שהגודל הכולל של הכותרות גדול מ-25 KB, הוא מפסיק וזורק את השגיאה:

      response headers size exceeding 25,600

      המשמעות היא שגודל הכותרת הכולל גדול מ-25 KB, ומערכת Apigee מציגה את השגיאה כשהגודל מתחיל לחרוג מהמגבלה של 25 KB עם קוד השגיאה protocol.http.TooBigHeaders

רזולוציה

תיקון המידה

אפשרות 1 [מומלצת]: תיקון האפליקציה של שרת היעד כך שלא יישלחו כותרות בגודל שחורג מהמגבלה של Apigee

  1. לנתח את הסיבה לכך שגודל כותרת התגובה של שרת היעד הספציפי גדול יותר מהמגבלה המותרת שמוגדרת במגבלות.
  2. אם זה לא רצוי, צריך לשנות את אפליקציית השרת העורפי כך שתשלח את כותרות התגובה שהגודל שלהן קטן מהמגבלה המותרת ב-Apigee Edge.
  3. בודקים אם אפשר לשלוח את פרטי הכותרת כחלק מגוף התשובה.
  4. אם אפשר, כדאי לשלוח בגוף התשובה כל מידע גדול שתכננתם לשלוח כחלק מהכותרת. כך תוכלו לוודא שלא תחרגו מהמגבלה של כותרת התגובה.

CwC

אפשרות 2 : שימוש במאפיין CwC כדי להגדיל את מגבלת הגודל של כותרת התגובה

ב-Apigee יש מאפיין CwC שמאפשר להגדיל את מגבלת הגודל של כותרות התגובה. פרטים נוספים זמינים במאמר בנושא הגדרת מגבלות למעבד ההודעות.

מגבלות

ב-Apigee מצפים שאפליקציית הלקוח ושרת הקצה העורפי לא ישלחו גדלים של כותרות שגדולים מהמגבלה המותרת, כפי שמתואר במאמר מגבלות Apigee Edge בקטע 'גודל כותרת הבקשה/התגובה'.

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

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

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

  1. במחשב של מעבד ההודעות, מחפשים את המאפיין HTTPResponse.headers.limit בספרייה /opt/apigee/edge-message-processor/conf ובודקים איזה ערך הוגדר, כמו שמוצג בהמשך:
    grep -ri "HTTPResponse.headers.limit" /opt/apigee/edge-message-processor/conf
    
  2. התוצאה לדוגמה מהפקודה שלמעלה היא:
    /opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.headers.limit=25k
  3. בדוגמת הפלט שלמעלה, שימו לב שהמאפיין HTTPResponse.headers.limit הוגדר עם הערך 25k ב-http.properties.

    המשמעות היא שהמגבלה על גודל מטען הייעודי (payload) של התגובה שהוגדרה ב-Apigee לענן פרטי היא 25KB.

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

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

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

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

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

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

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