אתם צופים במסמכי התיעוד של 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':
- נכנסים לממשק המשתמש של Apigee Edge כמשתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף Analyze > API Monitoring > Investigate.
- בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
- משרטטים את קוד התקלה מול הזמן.
- בוחרים תא עם קוד השגיאה
protocol.http.TooBigHeadersוקוד הסטטוס431כמו בדוגמה הבאה:( הגדלת התמונה)
יוצג מידע על קוד התקלה
protocol.http.TooBigHeadersכמו בדוגמה הבאה:( הגדלת התמונה)
לוחצים על הצגת יומנים ומרחיבים את השורה של הבקשה שנכשלה:
( הגדלת התמונה)
בחלון Logs, שימו לב לפרטים הבאים:
- קוד סטטוס:
431 - מקור התקלה:
apigee - קוד שגיאה:
protocol.http.TooBigHeaders. - אורך הבקשה(בבייט):
32150 (> 25 KB)
- קוד סטטוס:
- אם הערך של Fault Source הוא
apigeeאוMP, הערך של Fault Code הואprotocol.http.TooBigHeadersוהערך של Request Length גדול מ-25 KB, סימן שהגודל הכולל של כל כותרות הבקשה שנשלחו על ידי אפליקציית הלקוח כחלק מבקשת HTTP גדול מהמגבלה המותרת ב-Apigee .
כלי המעקב
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי שגיאות HTTP
431. בודקים את יומני הגישה של NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logאיפה: הערכים ORG, ENV ו-PORT# מוחלפים בערכים בפועל.
- מחפשים כדי לראות אם יש
431שגיאות במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם431. אם מופיעות שגיאות
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.TooBigHeadersX-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.
הסיבה: גודל כותרות הבקשות גדול מהמגבלה המותרת
אבחון
- כדי לזהות את קוד השגיאה, מקור השגיאה וגודל אורך הבקשה של השגיאה שנצפתה, אפשר להשתמש ב-API Monitoring או ביומני הגישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון.
- אם הערך של Fault Source הוא
apigeeאוMP, הערך של Fault Code הואprotocol.http.TooBigHeaders, והערך של Request Length גדול מ-25 KB, סימן שגודל הבקשה שנשלחה על ידי אפליקציית הלקוח אל Apigee גדול מהמגבלה המותרת ב-Apigee Edge. - אפשר לוודא שגודל כותרות הבקשה חרג מהמגבלה המותרת של 25 KB באחת מהשיטות הבאות:
הודעת שגיאה
כדי לאמת באמצעות הודעת השגיאה:
אם יש לכם גישה להודעת השגיאה המלאה שהתקבלה מ-Apigee Edge, תוכלו לעיין ב
faultstring. הערךfaultstringמציין שהגודל הכולל של כותרות הבקשה חרג מהמגבלה המותרת של 25 KB.הודעת שגיאה לדוגמה:
"faultstring":"request headers size exceeding 25,600"
הבקשה בפועל
כדי לאמת באמצעות הבקשה בפועל:
אם יש לכם גישה לבקשה בפועל שבוצעה על ידי אפליקציית הלקוח, אז צריך לבצע את השלבים הבאים:
- בודקים את הגודל של הכותרות שמועברות בבקשה.
אם תגלו שהגודל הכולל של הכותרות גדול יותר מהמגבלה המותרת ב-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.
בודקים את היומנים של מעבד ההודעות:
/opt/apigee/var/log/edge-message-processor/logs/system.log- מחפשים כדי לראות אם יש
431שגיאות במהלך משך זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם431. אפשר להשתמש במחרוזות החיפוש הבאות.grep -ri "exceeding"
grep -ri "RequestHeadersTooLarge"
- יוצגו שורות מ-
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 [מומלצת]: מתקנים את אפליקציית הלקוח כך שלא תשלח כותרות של בקשות עם גודל כולל שגדול מהמגבלה המותרת
- צריך לנתח את הסיבה לכך שהלקוח הספציפי שולח כותרת בקשה בגודל גדול, שגורם לגודל הכותרת הכולל להיות גדול יותר מהמגבלה המותרת שמוגדרת במגבלות.
אם זה לא רצוי, צריך לשנות את אפליקציית הלקוח כך שהיא תשלח כותרות של בקשות בגודל קטן יותר מהמגבלה המותרת.
בדוגמה שצוינה למעלה, אפשר לפתור את הבעיה על ידי העברת הפרמטר של ערכי הכותרת הארוכים כחלק מגוף הבקשה או ממטען הייעודי (payload):
curl -v https://HOSTALIAS/test -d '{ "header0: 000000000000000000……..000000<trimmed>" , "header1: 111111111111111111……..111111<ttrimmed>" , "header2: 222222222222222222……..222222<ttrimmed>", "header3: 333333333333333333……..333333<ttrimmed>" }'- אם רוצים לשלוח כותרת מעבר למגבלה המותרת, אפשר לעבור לאפשרות הבאה.
CwC
אפשרות 2 : שימוש במאפיין CwC כדי להגדיל את מגבלת השורות של הבקשה
Apigee מספק מאפיין CwC שמאפשר להגדיל את המגבלה של גודל שורת הבקשה. פרטים נוספים מופיעים במאמר בנושא הגדרת המגבלה על שורת הבקשה במעבד ההודעות
מגבלות
מערכת Apigee מצפה שאפליקציית הלקוח ושרת הקצה העורפי לא ישלחו כותרות של בקשות או תגובות שגודלן גדול מהמגבלה המותרת, כפי שמפורט במאמר מגבלות ב-Apigee Edge בנושא מגבלת הגודל של כותרות של בקשות או תגובות.
- אם אתם משתמשים בענן ציבורי, המגבלה המקסימלית לגודל של כותרות בקשות ותגובות היא כמו שמתועד לגבי גודל הכותרת של בקשה או תגובה במגבלות של Apigee Edge.
- אם אתם משתמשים ב-Private Cloud, יכול להיות ששיניתם את מגבלת ברירת המחדל המקסימלית של גודל כותרות הבקשה והתגובה (למרות שזו לא שיטה מומלצת). כדי לדעת מה המגבלה המקסימלית הנוכחית של גודל כותרת הבקשה, אפשר לפעול לפי ההוראות במאמר איך בודקים את המגבלה הנוכחית.
איך בודקים את המגבלה הנוכחית?
בקטע הזה מוסבר איך לוודא שהנכס HTTPRequest.headers.limit עודכן עם ערך חדש במעבדי ההודעות.
- במחשב של מעבד ההודעות, מחפשים את המאפיין
HTTPRequest.headers.limitבספרייה/opt/apigee/edge-message-processor/confובודקים איזה ערך הוגדר, כמו שמוצג בהמשך:grep -ri "HTTPRequest.headers.limit" /opt/apigee/edge-message-processor/conf
- התוצאה לדוגמה מהפקודה שלמעלה היא:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPRequest.headers.limit=25k
בדוגמת הפלט שלמעלה, שימו לב שהמאפיין
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