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 Request Header Fields Too Large.

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

סיבה תיאור הוראות לפתרון בעיות שרלוונטיות ל
גודל כותרות הבקשות גדול מהמגבלה המותרת הגודל הכולל של כל הכותרות שנשלחות על ידי אפליקציית הלקוח כחלק מבקשת ה-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. משרטטים את קוד התקלה מול הזמן.
  6. בוחרים תא עם קוד השגיאה protocol.http.TooBigHeaders וקוד הסטטוס 431 כמו בדוגמה הבאה:

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

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

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

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

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

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

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

כלי המעקב

NGINX

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

  1. אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני הגישה של 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 גדול מ-25 KB, הגבול המותר לכותרות של בקשות ב-Apigee Edge)

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

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

אבחון

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

    הודעת שגיאה

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

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

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

    "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 גדול מ-25 KB, כלומר הוא מכיל יותר מ-25 K תווים (בייטים) של ASCII.

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

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

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

    אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני Message Processor כדי לוודא שגודל כותרות הבקשה לא חרג מהמגבלה המותרת ב-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 בהודעת השגיאה שלמעלה מציין שהגודל הכולל של כותרות הבקשה הוא יותר מ-25 KB. לכן, ב-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. אם אתם משתמשים בענן ציבורי, המגבלה המקסימלית לגודל של כותרות בקשות ותגובות היא כמו שמתועד לגבי גודל הכותרת של בקשה או תגובה במגבלות של Apigee Edge.
  2. אם אתם משתמשים ב-Private Cloud, יכול להיות ששיניתם את מגבלת ברירת המחדל המקסימלית של גודל כותרות הבקשה והתגובה (למרות שזו לא שיטה מומלצת). כדי לדעת מה המגבלה המקסימלית הנוכחית של גודל כותרת הבקשה, אפשר לפעול לפי ההוראות במאמר איך בודקים את המגבלה הנוכחית.

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

בקטע הזה מוסבר איך לוודא שהנכס 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, section 5: 431 Request Header Fields Too Large

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

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

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

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

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

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

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