אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X. מידע
תיאור הבעיה
אפליקציית הלקוח מקבלת קוד סטטוס של HTTP 502 Bad Gateway עם קוד שגיאה protocol.http.TooBigLine כתגובה לקריאות ל-API.
הודעת שגיאה
אפליקציית הלקוח מקבלת את קוד התגובה הבא:
HTTP/1.1 502 Bad Gateway
בנוסף, יכול להיות שתופיע הודעת השגיאה הבאה:
{
"fault":{
"faultstring":"response line size exceeding 2,048",
"detail":{
"errorcode":"protocol.http.TooBigLine"
}
}
}גורמים אפשריים
השגיאה הזו מתרחשת אם הגודל של Response-Line שנשלח על ידי שרת היעד או השרת העורפי אל Apigee Edge כחלק מתגובת ה-HTTP גדול מהמגבלה המקסימלית המותרת ב-Apigee Edge.
לפני שנבדוק את הסיבות האפשריות לשגיאה הזו, נסביר מה המשמעות של Response-Line ואיך בודקים את הגודל שלה.
הסבר על Response-Line
תשובת HTTP טיפוסית מורכבת משלושה חלקים:
- Status-Line (נקרא Response-Line ב-Apigee)
- ( Set of HTTP headers )
- [ Body ]
שורת התגובה מורכבת משלושה חלקים: גרסת הפרוטוקול, ואחריה קוד סטטוס מספרי והביטוי הטקסטואלי שמשויך אליו, כמו שמוצג בהמשך:
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
כששרת היעד או שרת הקצה העורפי שולח תגובת HTTP, השורה הראשונה שנשלחת מייצגת את שורה התגובה כפי שמתואר למעלה. אחרי זה מופיעות הכותרות וגוף התשובה או המטען הייעודי.בצילום המסך לדוגמה הבא מוצגת בקשת curl טיפוסית, החלק Request והחלק Response (יחד עם Response-Line).
הסבר על גודל שורת התגובה
בדוגמה שצוינה למעלה, השורה start (השורה הראשונה) בתגובה, שנקראת גם Response-Line, היא כזו:
HTTP/1.1 200 OK
הגודל של שורת התגובה הזו הוא
~15 bytesכי היא מכילה15 ASCII characters. מכיוון שהערך הזה נמצא בגבול המותר ב-Apigee Edge, התגובה נשלחת חזרה ללקוח ללא שגיאות מ-Apigee Edge.- באופן דומה, אם מסתכלים על
faultstringבהודעת השגיאה שמוצגת למעלה, היא מכילה"response line size exceeding 2,048". המשמעות היא ששורת התגובה בתגובת ה-HTTP שנשלחה על ידי שרת היעד או השרת העורפי חרגה מ-2,048 בייט.
הסבר על שורת תגובה גדולה
בהתאם להגדרה של Status-Line (שנקראת כאן Response-Line) ולבקשות ותגובות HTTP טיפוסיות, הגודל יהיה קטן בהרבה מהמגבלה המוגדרת כברירת מחדל של 2 K ב-Apigee Edge, ולכן יכול להיות שלא נגיע למגבלה. עם זאת, הנה כמה תרחישים אפשריים שבהם יכול להיות שתחרגו מהמגבלה הזו:
- שרת היעד או השרת העורפי אינו מערכת HTTP. יכול להיות שהיא מגיבה בתגובה שאינה HTTP.
- יש בעיות בשרת היעד או בשרת העורפי, והוא שולח שורת תגובה ארוכה כחלק מתגובת ה-HTTP.
מידע נוסף על כך זמין במאמר בנושא קבלת השגיאה protocol.http.TooBigLine, 'גודל שורת התגובה חורג מ-2,048'.
אלה הסיבות האפשריות לשגיאה:
| סיבה | תיאור | הוראות לפתרון בעיות שרלוונטיות ל |
|---|---|---|
| גודל שורת התגובה גדול מהמגבלה המותרת | הגודל של Response-Line שנשלח על ידי שרת היעד או השרת העורפי כחלק מתגובת ה-HTTP ל-Apigee Edge גדול מהמגבלה המותרת ב-Apigee Edge. | משתמשים ב-Edge Public Cloud וב-Edge Private Cloud |
שלבים נפוצים לאבחון
כדי לאבחן את השגיאה הזו, אפשר להשתמש באחד מהכלים או מהטכניקות הבאים:
API Monitoring
כדי לאבחן את השגיאה באמצעות הכלי 'מעקב אחר API':
- נכנסים לממשק המשתמש של Apigee Edge כמשתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף Analyze > API Monitoring > Investigate.
- בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
- אפשר לבחור במסנן Proxy כדי לצמצם את קוד השגיאה.
- משרטטים את קוד התקלה מול הזמן.
בוחרים תא עם קוד השגיאה
protocol.http.TooBigLineכמו בדוגמה הבאה:( הגדלת התמונה)
יוצג מידע על קוד התקלה
protocol.http.TooBigLineכמו בדוגמה הבאה:( הגדלת התמונה)
לוחצים על הצגת יומנים ומרחיבים את השורה של הבקשה שנכשלה.
- בחלון יומנים, רושמים את הפרטים הבאים:
- קוד סטטוס:
502 - מקור התקלה:
target - קוד שגיאה:
protocol.http.TooBigLine.
- קוד סטטוס:
- אם הערך של Fault Source הוא
targetוהערך של Fault Code הואprotocol.http.TooBigLine, המשמעות היא שגודל שורת התגובה בתגובת ה-HTTP מהשרת של היעד או מהשרת העורפי גדול יותר מהמגבלה המקסימלית המותרת ב-Apigee Edge.
כלי המעקב
- מפעילים את trace session (מעקב אחר סשן) ואחת מהאפשרויות הבאות:
- מחכים שהשגיאה
502 Bad Gatewayתתרחש. או - אם אתם מצליחים לשחזר את הבעיה, מבצעים את קריאה ל-API ומשחזרים את השגיאה
502 Bad Gateway.
- מחכים שהשגיאה
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- אפשר לנווט בין השלבים השונים של ה-trace ולמצוא את המקום שבו התרחשה השגיאה.
בדרך כלל השגיאה מופיעה ב
flowinfoError מיד אחרי השלב Request sent to target server, כמו שמוצג כאן:
שימו לב לערכי השגיאה מהמעקב:
- שגיאה:
response line exceeding 2,048 - error.class:
com.apigee.errors.http.server.BadGateway
השגיאה הזו מציינת ש-Apigee Edge (רכיב Message Processor) מחזיר את השגיאה ברגע שהוא מקבל את התגובה משרת הקצה העורפי, כי גודל שורת התגובה חורג מהמגבלה המותרת.
- שגיאה:
הודעת השגיאה שתישלח ללקוח תוצג בשלב Response Sent to Client, כמו שמוצג בהמשך:
( הגדלת התמונה)
- שימו לב לערכי השגיאה מהמעקב:
- שגיאה:
502 Bad Gateway. - תוכן השגיאה:
{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
- שגיאה:
אפשר גם לעבור לשלב AX (נתוני Analytics שתועדו) במעקב וללחוץ עליו כדי לראות את פרטי השגיאה.
( הגדלת התמונה)
שימו לב לערכים הבאים:
כותרות של בקשות ערך X-Apigee-fault-code protocol.http.TooBigLineX-Apigee-fault-source targetתוכן השגיאה : גוף {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי שגיאות HTTP
502. בודקים את יומני הגישה של NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logאיפה: הערכים ORG, ENV ו-PORT# מוחלפים בערכים בפועל.
- מחפשים כדי לראות אם יש
502שגיאות במהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם502. אם מופיעות שגיאות
502עם הערך X-Apigee-fault-code שזהה לערך שלprotocol.http.TooBigLine, צריך לקבוע את הערך של X-Apigee-fault-source.
בדוגמה שלמעלה מיומן הגישה של NGINX, הערכים של X-Apigee-fault-code ושל X-Apigee-fault-source הם:
כותרות תגובה ערך X-Apigee-fault-code protocol.http.TooBigLineX-Apigee-fault-source target
הגורם: גודל שורת התגובה גדול מהמגבלה המותרת
אבחון
- כדי לקבוע את קוד השגיאה ואת מקור השגיאה של השגיאה שנצפתה, אפשר להשתמש בכלי למעקב אחר API, בכלי Trace או ביומני הגישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון.
- אם הערך של Fault Source הוא
target, המשמעות היא שגודל שורת התגובה שנשלחה על ידי אפליקציית השרת של היעד או העורף אל Apigee גדול יותר מהמגבלה המותרת ב-Apigee Edge. אפשר לוודא שגודל שורת התגובה חורג מהמגבלה המותרת של 2KB באמצעות אחת מהשיטות הבאות:
הודעת שגיאה
כדי לאמת באמצעות הודעת השגיאה:
אם יש לכם גישה להודעת השגיאה המלאה שהתקבלה מ-Apigee Edge, תוכלו לעיין ב
faultstring.הודעת שגיאה לדוגמה:
"faultstring":"response line size exceeding 2,048"
השגיאה
faultstringשמופיעה למעלה מציינת שגודל שורת התגובה חרג מהמגבלה המותרת של 2KB.הבקשה בפועל
כדי לאמת באמצעות הבקשה בפועל:
אם יש לכם גישה לבקשה בפועל שנשלחה לאפליקציית השרת של היעד או העורף, אתם יכולים לבצע את השלבים הבאים:
- בדיקת הגודל של שורת התגובה
- אם תגלו שהגודל של ה-URI גדול מהמגבלה המותרת ב-Apigee Edge, זו הסיבה לבעיה.
דוגמה לתגובה משרת היעד או השרת העורפי:
curl -v http://HOSTALIAS/test
* Trying 3.2.1.4... * TCP_NODELAY set * Connected to <hostalias> (3.2.1.4) port 80 (#0) > GET /test HTTP/1.1 > Host: HOSTALIAS > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 200 1111…<trimmed>...11111111 < Date: Mon, 26 Jul 2021 07:07:18 GMT < Content-Type: application/json < Content-Length: 269 < Connection: keep-alive < Server: gunicorn/19.9.0 < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true < { <Response Body> } * Connection #0 to host <hostalias> left intact * Closing connection 0
בדוגמה שלמעלה, שורת התגובה
HTTP/1.1 200 1111…<trimmed>...11111111גדולה מ-2KB, כלומר היא מכילה יותר מ-2, 000 תווים ב-ASCII.אם אתם משתמשים בלקוח אחר, אתם יכולים לעיין ביומני הלקוח ולנסות לגלות את הגודל של שורת התגובה שנשלחת אל Apigee Edge.
יומנים של מעבד הודעות
כדי לבצע אימות באמצעות יומני מעבד בקשות:
אם אתם משתמשים ב-Private Cloud, תוכלו להשתמש ביומני Message Processor כדי לוודא שגודל שורת התגובה חרג מהמגבלה המותרת ב-Apigee Edge.
- כדי לקבוע את מזהה ההודעה של הבקשה שנכשלה, משתמשים בכלי המעקב, בכלי לניתוח נתונים או ביומני הגישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון.
מחפשים את מזהה ההודעה ביומן של מעבד ההודעות:
/opt/apigee/var/log/edge-message-processor/logs/system.logיוצגו שורות מ-
system.logשדומות לאלה:2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592 useCount=1 bytesRead=0 bytesWritten=201 age=144ms lastIO=0ms isOpen=true.onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048 at <snipped> 2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError (HTTPResponse@6a5d6c33, response line size exceeding 2,048)
הטקסט
message = response line size exceeding 2,048בהודעת השגיאה שלמעלה מציין שהגודל של שורת התגובה גדול מ-2KB. לכן, Apigee Edge מעלה את החריגה ומחזיר קוד סטטוס502עם קוד שגיאהprotocol.http.TooBiglineלאפליקציות לקוח.
רזולוציה
תיקון המידה
אפשרות מספר 1 [מומלצת]: תיקון האפליקציה של שרת היעד או השרת העורפי כדי שלא ישלחו שורות תגובה בגודל שגדול מהמגבלה המותרת
- לנתח את הסיבה לכך שהלקוח הספציפי שולח שורת תגובה בגודל שחורג מהמגבלה המותרת כפי שמוגדר במגבלות.
- אם זה לא רצוי, צריך לשנות את אפליקציית השרת של היעד או העורף כך שהיא תשלח שורת תגובה בגודל שקטן מהמגבלה המותרת.
- אם רוצים לשלוח שורת תגובה בגודל שגדול מהמגבלה המותרת, אפשר לעבור לאפשרויות הבאות.
CwC
אפשרות 2: שימוש במאפיין CwC כדי להגדיל את המגבלה של שורת התגובה
Apigee מספק מאפיין CwC שמאפשר להגדיל את מגבלת הגודל של שורת התגובה. פרטים נוספים מופיעים במאמר בנושא הגדרת המגבלה של שורת התגובה במעבד ההודעות.
מגבלות
מערכת Apigee מצפה שאפליקציית הלקוח ושרת הקצה העורפי לא ישלחו שורות בקשה/תגובה שגודלן גדול מהמגבלה המותרת, כפי שמפורט במאמר מגבלת שורת בקשה/תגובה במגבלות של Apigee Edge.
- אם אתם משתמשים בענן ציבורי, המגבלה המקסימלית לגודל של שורת הבקשה והתגובה היא כפי שמפורט במאמר גודל שורת הבקשה/התגובה בנושא מגבלות ב-Apigee Edge.
- אם אתם משתמשים ב-Private Cloud, יכול להיות ששיניתם את מגבלת ברירת המחדל המקסימלית של גודל השורה של בקשות ותשובות (למרות שזו לא שיטה מומלצת). כדי לקבוע את המגבלה המקסימלית של גודל שורת התגובה, אפשר לפעול לפי ההוראות במאמר איך בודקים את המגבלה הנוכחית.
איך בודקים את המגבלה הנוכחית?
בקטע הזה מוסבר איך לוודא שהנכס HTTPResponse.line.limit עודכן עם ערך חדש במעבדי ההודעות.
- במחשב של מעבד ההודעות, מחפשים את המאפיין
HTTPResponse.line.limitבספרייה/opt/apigee/edge-message-processor/confובודקים איזה ערך הוגדר, כמו שמוצג בהמשך:grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
- התוצאה לדוגמה מהפקודה שלמעלה היא:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
בדוגמת הפלט שלמעלה, אפשר לראות שהמאפיין
HTTPResponse.line.limitהוגדר עם הערך2kב-http.properties.המשמעות היא שהמגבלה על גודל שורת התגובה שהוגדרה ב-Apigee לענן פרטי היא 2KB.
אם עדיין דרושה לך עזרה מצוות התמיכה של 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