431 Request Header fields גדול מדי – ToBigHeaders

מוצג המסמך של Apigee Edge.
עוברים אל מסמכי תיעוד של Apigee X.
מידע

תיאור הבעיה

אפליקציית הלקוח מקבלת קוד סטטוס HTTP של 431 Request Header Fields Too Large עם קוד שגיאה protocol.http.TooBigHeaders כתגובה ל-API שיחות.

הודעת שגיאה

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

HTTP/1.1 431 Request Header Fields Too Large

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

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

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

השגיאה הזו מתקבלת אם הגודל הכולל של כל כותרות הבקשה שנשלחו על ידי אפליקציית הלקוח אל Apigee Edge כחלק מבקשת ה-HTTP גדולה יותר מ- המגבלה המותרת ב-Apigee Edge לפי RFC 6585, סעיף 5: 431 שדות של כותרות בקשות גדולים מדי.

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

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

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

יש להשתמש באחד מהכלים או השיטות הבאים כדי לאבחן את השגיאה:

מעקב API

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

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

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

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

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

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

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

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

  9. בחלון יומנים שימו לב לפרטים הבאים:

    • קוד סטטוס: 431
    • מקור התקלה: apigee
    • קוד התקלה: protocol.http.TooBigHeaders.
    • אורך הבקשה(בייטים): 32150 (> 25 KB)
  10. אם ל-Fault Source יש את הערך apigee או MP, קוד השגיאה כולל את הערך protocol.http.TooBigHeaders ו Request Length הוא יותר מ-25KB. זה אומר שהגודל הכולל של כל כותרות הבקשות שנשלחות על ידי אפליקציית הלקוח כחלק מבקשת HTTP גדולה יותר מאשר למגבלה ב-Apigee.

כלי המעקב

NGINX

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

  1. אם אתם משתמשים בענן פרטי, תוכלו להשתמש ביומני הגישה ל-NGINX כדי לדעת את המידע העיקרי לגבי שגיאות HTTP 431.
  2. בודקים את יומני הגישה ל-NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    איפה: ORG, ENV ו-PORT# מוחלפים בערכים בפועל.

  3. אפשר לחפש אם יש שגיאות 431 בטווח זמן ספציפי (אם הבעיה אירעה בעבר) או אם יש בקשות שעדיין לא נענו 431
  4. אם מופיעות שגיאות 431 בקוד X-Apigee-fault-code תואם לערך של protocol.http.TooBigHeaders, ואז קובעים הערך של X-Apigee-fault-source.

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

    כותרות של תשובות ערך
    X-Apigee-fault-code protocol.http.TooBigHeaders
    X-Apigee-fault-source MP

    לתשומת ליבכם: אורך הבקשה: 40159 (40 KB גדול מ-25KB, המגבלה המותרת לכותרות של בקשות ב-Apigee Edge)

    ברשומת היומן לדוגמה שלמעלה, הערך של X-Apigee-fault-source מכיל את הערך. apigee או MP, ל-X-Apigee-fault-code יש את הערך protocol.http.TooBigHeaders ו-Request Length הוא 40 KB, כלומר יותר מהמגבלה המותרת ב-Apigee – 25KB. הדבר מציין בבירור הגודל הכולל של כל כותרות הבקשות שנשלחות על ידי אפליקציית הלקוח כחלק מ-HTTP הבקשה חרגה מהמגבלה המותרת של 25KB ב-Apigee Edge.

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

אבחון

  1. קובעים את Fault Code (קוד התקלה), Fault Source וגודל בקשה-אורך של שנצפתה באמצעות יומני API Monitoring או NGINX Access, כמו שמוסבר ב שלבי האבחון הנפוצים.
  2. אם ל-Fault Source יש את הערך apigee או MP, קוד השגיאה כולל את הערך protocol.http.TooBigHeaders, ו-Request Length יותר מ-25KB, אז זה מציין שגודל הבקשה שנשלח על ידי אפליקציית הלקוח ל-Apigee גדול מ- מותר להשתמש ב-Apigee Edge.
  3. אפשר לוודא שגודל הכותרות של הבקשה חרג מהמגבלה המותרת של 25 KB באמצעות אחת מהאפשרויות הבאות: אחת מהשיטות הבאות:

    הודעת שגיאה

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

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

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

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

    הבקשה בפועל

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

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

    1. צריך לאמת את גודל הכותרות שהועברו בבקשה.
    2. אם גיליתם שהגודל הכולל של הכותרות גדול מהגודל המגבלה המותרת ב-Apigee Edge, אז היא את הגורם לבעיה.

      בקשה לדוגמה:

      curl -v https://HOSTALIAS/test -H "header0: 000000000000000000……..000000<trimmed>" -H "header1: 111111111111111111……..111111<trimmed>" -H "header2: 222222222222222222……..222222<trimmed>"-H "header3: 333333333333333333……..333333<trimmed>"
      

      במקרה שלמעלה, הגודל הכולל של הכותרות header0, header1, header2 ו-header3 גדול מ-25KB, כלומר מכיל יותר מ-25K K תווי ASCII (בייטים).

      אם אתם משתמשים בלקוח אחר, אפשר לבדוק את יומני הלקוח לנסות לברר את הגודל של שורת הבקשה שנשלחת ל-Apigee Edge.

    יומני מעבד ההודעות

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

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

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

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

    2. אפשר לחפש כדי לראות אם יש שגיאות 431 במהלך תקופה ספציפית משך הזמן (אם הבעיה התרחשה בעבר) או אם יש בקשות כלשהן עדיין נכשל עם 431. אפשר להשתמש במחרוזות החיפוש הבאות.
      grep -ri "exceeding"
      
      grep -ri "RequestHeadersTooLarge"
      
    3. יופיעו שורות מ-system.log שדומות לאלה:
      2021-07-27 08:30:28,419  NIOThread@1 ERROR ADAPTORS.HTTP.FLOW -
      AbstractRequestListener.onException() :
      Request:GET, uri:/test/, message Id:null,
      exception:com.apigee.errors.http.user.RequestHeadersTooLarge{
      code = protocol.http.TooBigHeaders, message = request headers size
      exceeding 25,600, associated contexts = []}, context:Context@9c5903
      input=ClientInputChannel(SSLClientChannel[Accepted:
      Remote:192.168.205.251:8443 Local:192.168.67.23:22188]@25130
      useCount=1 bytesRead=0 bytesWritten=15367 age=667062ms  lastIO=0ms
      isOpen=true)
      

      הטקסט message = request headers size exceeding 25,600 במחרוזת הודעת השגיאה שלמעלה מציינת שהגודל הכולל של כותרות הבקשה גדול מ- 25KB. לכן, Apigee Edge מקפיצה את החריג com.apigee.errors.http.user.RequestHeadersTooLarge והחזרות קוד סטטוס 431 עם קוד שגיאה protocol.http.TooBigHeaders לאפליקציות לקוח.

רזולוציה

תיקון הגודל

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

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

    בדוגמה שלמעלה, ניתן לתקן את הבעיה על ידי העברת הכותרת הארוכה. ערכים כחלק מגוף הבקשה/מטען הייעודי (Payload):

    curl -v https://HOSTALIAS/test -d '{ "header0: 000000000000000000……..000000<trimmed>" , "header1: 111111111111111111……..111111<ttrimmed>" , "header2: 222222222222222222……..222222<ttrimmed>", "header3: 333333333333333333……..333333<ttrimmed>" }'
    
  3. אם רוצים לשלוח כותרת מעל המגבלה המותרת, עוברים אל לאפשרות הבאה.

CwC

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

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

מגבלות

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

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

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

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

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

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

מפרט

Apigee Edge מצפה שאפליקציית הלקוח לא תשלח כותרות גדולות כחלק בקשה. אם הבקשה מכילה כותרות שהגודל הכולל שלהן חורג מהמגבלה שצוינה, Apigee זורקת את 431 Request Header Fields Too Large בהתאם ל-RFC הבא מפרטים:

מפרט
RFC 6585, סעיף 5: שדות כותרת של בקשה 431 גדולים מדי

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

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

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

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

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

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

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