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

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

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

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

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

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

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

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

כלי המעקב

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

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

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

    • שגיאה: 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 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. אם אתם משתמשים בענן פרטי, תוכלו להשתמש ביומני הגישה ל-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. קובעים את Fault Code (קוד שגיאה), Fault Source (מקור התקלה) וגודל מטען ייעודי (payload) של תגובה בשביל שגיאה שזוהתה באמצעות API Monitoring, כלי מעקב או יומני NGINX Access, כמו שמוסבר ב שלבי האבחון הנפוצים.
  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

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

רזולוציה

תיקון הגודל

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

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

CwC

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

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

מגבלות

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

  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, עליכם לספק את הפרטים הבאים:

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

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

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