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 הציבוריים והפרטיים

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

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

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

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

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

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

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

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

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

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

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

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

כלי המעקב

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

אבחון

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

    הודעת השגיאה

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

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

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

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

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

    בקשה בפועל

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

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

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

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

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

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

      response headers size exceeding 25,600

      ניתן להסיק שהערך של Total Header Type גדול מ-25KB, ו-Apigee מקפץ את הודעת השגיאה כאשר הגודל מתחיל לחרוג מהמגבלה של 25KB עם קוד השגיאה protocol.http.TooBigHeaders

רזולוציה

תיקון הגודל

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

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

CwC

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

Apigee מספק מאפיין של CwC שמאפשר לו להגדיל את מגבלת הגודל של כותרות תגובה. מידע נוסף מופיע במאמר הגדרת מגבלות למעבד ההודעות.

מגבלות

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

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

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

בקטע הזה מוסבר איך לוודא שהמאפיין 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:

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

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

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

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