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, section 5: 431 Request Header Fields too Large.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • קוד סטטוס: 431
    • מקור התקלה: apigee
    • קוד תקלה: protocol.http.TooBigHeaders.
    • אורך הבקשה: 32150 (> 25 KB)
  10. אם ל-Fault Source יש את הערך apigee או MP, הערך של Fault Code כולל את הערך 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 שתואם לערך של X-Apigee-fault-code , צריך לקבוע את הערך של X-Apigee-fault-code

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

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

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

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

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

אבחון

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

    הודעת השגיאה

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

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

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

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

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