אתם צופים במסמכי התיעוד של 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 Public Cloud וב-Edge Private Cloud |
שלבים נפוצים לאבחון
כדי לאבחן את השגיאה הזו, אפשר להשתמש באחד מהכלים או מהטכניקות הבאים:
API Monitoring
כדי לאבחן את השגיאה באמצעות הכלי 'מעקב אחר API':
- נכנסים לממשק המשתמש של Apigee Edge כמשתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף Analyze > API Monitoring > Investigate.
- בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
- אפשר לבחור במסנן Proxy כדי לצמצם את קוד השגיאה.
- משרטטים את קוד התקלה מול הזמן.
בוחרים תא עם קוד השגיאה
protocol.http.TooBigHeadersכמו בדוגמה הבאה:( הגדלת התמונה)
יוצג מידע על קוד התקלה
protocol.http.TooBigHeadersכמו בדוגמה הבאה:( הגדלת התמונה)
לוחצים על הצגת יומנים ומרחיבים את השורה של הבקשה שנכשלה.
( הגדלת התמונה)
- בחלון יומנים, רושמים את הפרטים הבאים:
- קוד סטטוס:
502 - מקור התקלה:
target - קוד שגיאה:
protocol.http.TooBigHeaders.
- קוד סטטוס:
- אם הערך של Fault Source הוא
targetוהערך של Fault Code הואprotocol.http.TooBigHeaders, המשמעות היא שהתגובה של HTTP מהשרת של היעד או מהקצה העורפי כוללת כותרות שהגודל שלהן גדול מהמגבלה המותרת ב-Apigee Edge.
כלי המעקב
- מפעילים את trace session (מעקב אחר סשן) ואחת מהאפשרויות הבאות:
- ממתינים להתרחשות השגיאה
502 Bad Gateway, או - אם אתם מצליחים לשחזר את הבעיה, מבצעים את קריאה ל-API ומשחזרים את השגיאה
502 Bad Gateway.
- ממתינים להתרחשות השגיאה
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- אפשר לנווט בין השלבים השונים של ה-trace ולמצוא את המקום שבו התרחשה השגיאה.
בדרך כלל השגיאה הזו מופיעה בתהליך שנקרא Error מיד אחרי השלב Request sent to target server, כמו שמוצג בהמשך:
( הגדלת התמונה)
שימו לב לערכי השגיאה מהמעקב:
- שגיאה:
response headers size exceeding 25,600 - error.class:
com.apigee.errors.http.server.BadGateway
השגיאה הזו מציינת ש-Apigee Edge (רכיב Message Processor) מחזיר את השגיאה ברגע שהוא מקבל את התגובה משרת הקצה העורפי, כי גודל הכותרת חורג מהמגבלה המותרת.
- שגיאה:
השגיאה תופיע בתגובה Response Sent to Client שנשלחה על ידי Apigee Edge, כמו שמוצג בהמשך:
( הגדלת התמונה)
- שימו לב לערכי השגיאה מהמעקב. בדוגמה שלמעלה של נתוני מעקב מוצג:
- שגיאה:
502 Bad Gateway. - תוכן השגיאה:
{"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
- שגיאה:
עוברים לשלב AX (Analytics Data Recorded) בנתוני המעקב ולוחצים עליו כדי לראות את הפרטים שקשורים אליו.
( הגדלת התמונה)
שימו לב לערכים הבאים:
כותרות שגיאה ערך X-Apigee-fault-code protocol.http.TooBigHeadersX-Apigee-fault-source targetתוכן השגיאה: גוף {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשי Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי HTTP
502 Bad Gateway. בודקים את יומני הגישה של NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logאיפה: הערכים ORG, ENV ו-PORT# מוחלפים בערכים בפועל.
- מחפשים אם יש
502שגיאות עם קוד השגיאהprotocol.http.TooBigHeadersבמהלך פרק זמן ספציפי (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם502. אם מופיעות שגיאות
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.TooBigHeadersX-Apigee-fault-source target
הסיבה: גודל הכותרות בתגובה גדול מהמגבלה המותרת
אבחון
- כדי לקבוע את קוד השגיאה, מקור השגיאה וגודל מטען התגובה של השגיאה שנצפתה, אפשר להשתמש בכלי API Monitoring, בכלי Trace או ביומני הגישה של NGINX, כמו שמוסבר במאמר שלבים נפוצים לאבחון.
- אם הערך של Fault Source הוא
target, המשמעות היא שהתשובה שנשלחה משרת היעד או מהשרת העורפי אל Apigee מכילה כותרות שהגודל שלהן גדול יותר מהמגבלה המותרת ב-Apigee Edge. - כדי לוודא שהתגובה מהיעד או מהקצה העורפי כוללת כותרות שהגודל שלהן גדול מהמגבלה המותרת, אפשר להשתמש באחת מהשיטות הבאות:
הודעת שגיאה
כדי לאמת באמצעות הודעת השגיאה:
אם יש לכם גישה להודעת השגיאה המלאה שהתקבלה מ-Apigee Edge, תוכלו לעיין ב
faultstring. השגיאהfaultstringמציינת שגודל כותרת התגובה חרג מהמגבלה המותרת.הודעת שגיאה לדוגמה:
"faultstring":"response headers size exceeding 25,600"
בהודעת השגיאה שלמעלה, שימו לב שבקטע
faultstringהתגובה כוללת כותרות שהגודל הכולל שלהן חורג מהמגבלה המותרת.הבקשה בפועל
כדי לאמת באמצעות הבקשה בפועל:
אם יש לכם גישה לבקשה בפועל שנשלחה לשרת היעד או לשרת העורפי, אתם יכולים לבצע את השלבים הבאים:
- אם אתם משתמשים ב-Public Cloud או ב-Private Cloud, אתם יכולים לשלוח בקשה ישירות לשרת הקצה העורפי משרת הקצה העורפי עצמו או מכל מכונה אחרת שממנה מותר לכם לשלוח בקשה לשרת הקצה העורפי.
- אם אתם משתמשים ב-Private Cloud, אתם יכולים גם לשלוח את הבקשה לשרת הקצה העורפי מאחד ממעבדי ההודעות.
- בודקים את התגובה שהתקבלה משרת הקצה העורפי, ובאופן ספציפי מחשבים ומאמתים את הגודל הכולל של הכותרות שהועברו בתגובה.
אם תגלו שגודל הכותרות במטען הייעודי (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.
יומנים של מעבד הודעות
כדי לבצע אימות באמצעות יומני מעבד בקשות:
אם אתם משתמשים ב-Private Cloud, תוכלו להשתמש ביומני Message Processor כדי לוודא שגודל כותרות התגובה לא חרג מהמגבלה המותרת ב-Apigee Edge.
בודקים את היומנים של מעבד ההודעות:
/opt/apigee/var/log/edge-message-processor/logs/system.log- מחפשים כדי לראות אם יש
502שגיאות במהלך משך זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם502. אפשר להשתמש במחרוזת החיפוש הבאה:grep -ri "response headers size exceeding"
- תוכלו למצוא שורות מ-
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)
-
ברגע שמעבד ההודעות מקבל את התגובה מהשרת העורפי או מהשרת היעד, ומגלה שהגודל הכולל של הכותרות גדול מ-25 KB, הוא מפסיק וזורק את השגיאה:
response headers size exceeding 25,600המשמעות היא שגודל הכותרת הכולל גדול מ-25 KB, ומערכת Apigee מציגה את השגיאה כשהגודל מתחיל לחרוג מהמגבלה של 25 KB עם קוד השגיאה
protocol.http.TooBigHeaders
רזולוציה
תיקון המידה
אפשרות 1 [מומלצת]: תיקון האפליקציה של שרת היעד כך שלא יישלחו כותרות בגודל שחורג מהמגבלה של Apigee
- לנתח את הסיבה לכך שגודל כותרת התגובה של שרת היעד הספציפי גדול יותר מהמגבלה המותרת שמוגדרת במגבלות.
- אם זה לא רצוי, צריך לשנות את אפליקציית השרת העורפי כך שתשלח את כותרות התגובה שהגודל שלהן קטן מהמגבלה המותרת ב-Apigee Edge.
- בודקים אם אפשר לשלוח את פרטי הכותרת כחלק מגוף התשובה.
- אם אפשר, כדאי לשלוח בגוף התשובה כל מידע גדול שתכננתם לשלוח כחלק מהכותרת. כך תוכלו לוודא שלא תחרגו מהמגבלה של כותרת התגובה.
CwC
אפשרות 2 : שימוש במאפיין CwC כדי להגדיל את מגבלת הגודל של כותרת התגובה
ב-Apigee יש מאפיין CwC שמאפשר להגדיל את מגבלת הגודל של כותרות התגובה. פרטים נוספים זמינים במאמר בנושא הגדרת מגבלות למעבד ההודעות.
מגבלות
ב-Apigee מצפים שאפליקציית הלקוח ושרת הקצה העורפי לא ישלחו גדלים של כותרות שגדולים מהמגבלה המותרת, כפי שמתואר במאמר מגבלות Apigee Edge בקטע 'גודל כותרת הבקשה/התגובה'.
- אם אתם משתמשי ענן ציבורי, המגבלה המקסימלית לגודל הכותרות של בקשות ותגובות היא כפי שמפורט במאמר גודל הכותרת של בקשה/תגובה במגבלות של Apigee Edge.
- אם אתם משתמשים ב-Private Cloud, יכול להיות ששיניתם את מגבלת ברירת המחדל המקסימלית של גודל הכותרות של בקשות ותשובות (למרות שזו לא שיטה מומלצת). כדי לקבוע את המגבלה המקסימלית של גודל כותרת התגובה, פועלים לפי ההוראות במאמר איך בודקים את המגבלה הנוכחית.
איך בודקים את המגבלה הנוכחית?
בקטע הזה מוסבר איך לוודא שהנכס HTTPResponse.headers.limit עודכן עם ערך חדש במעבדי ההודעות.
- במחשב של מעבד ההודעות, מחפשים את המאפיין
HTTPResponse.headers.limitבספרייה/opt/apigee/edge-message-processor/confובודקים איזה ערך הוגדר, כמו שמוצג בהמשך:grep -ri "HTTPResponse.headers.limit" /opt/apigee/edge-message-processor/conf
- התוצאה לדוגמה מהפקודה שלמעלה היא:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.headers.limit=25k
בדוגמת הפלט שלמעלה, שימו לב שהמאפיין
HTTPResponse.headers.limitהוגדר עם הערך25kב-http.properties.המשמעות היא שהמגבלה על גודל מטען הייעודי (payload) של התגובה שהוגדרה ב-Apigee לענן פרטי היא 25KB.
אם עדיין דרושה לך עזרה מצוות התמיכה של Apigee, אפשר לעבור אל איסוף מידע לצורך אבחון.
צריך לאסוף פרטי אבחון
אוספים את נתוני האבחון הבאים ופונים אל התמיכה של Apigee Edge:
אם אתם משתמשי ענן ציבורי, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם ה-proxy ל-API
- הפקודה
curlשבה השתמשת כדי לשחזר את השגיאה502 - קובץ מעקב לבקשות ה-API
- פלט מלא של התגובה משרת היעד או השרת העורפי, יחד עם גודל הכותרות
אם אתם משתמשים ב-Private Cloud, עליכם לספק את הפרטים הבאים:
- הודעת השגיאה המלאה שזוהתה בבקשות שנכשלו
- שם הארגון
- שם הסביבה
- חבילת proxy ל-API
- קובץ מעקב של בקשות ה-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