כרגע מוצג התיעוד של 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.
לפני שנבחן את הסיבות האפשריות לשגיאה הזו, נסביר מה המשמעות של שורת התגובה ואיך בודקים את הגודל שלה.
הסבר על שורת התגובה
תגובת HTTP טיפוסית מורכבת משלושה חלקים:
- Status-Line (נקרא Response-Line ב-Apigee)
- ( קבוצת כותרות HTTP )
- [ גוף ]
שורת התגובה מורכבת משלושה חלקים: גרסת פרוטוקול ואחריה קוד סטטוס מספרי והביטוי הטקסטואלי שמשויך אליה, כפי שאפשר לראות כאן:
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
כאשר תגובת HTTP נשלחת על ידי אפליקציית שרת היעד/הקצה העורפי, השורה הראשונה שנשלחת מייצגת את Response-Line כפי שתואר למעלה. לאחר מכן מופיעות הכותרות וגוף התגובה/מטען הייעודי (payload). בצילום המסך לדוגמה הבא מוצגת בקשה אופיינית של curl
, החלק Request והחלק Response (יחד עם שורת התגובה).
הסבר על הגודל של שורת התגובה
בדוגמה שלמעלה, שורת ההתחלה (השורה הראשונה) בתשובה נקראת גם Response-Line:
HTTP/1.1 200 OK
הגודל של שורת התגובה הזו הוא
~15 bytes
כי היא מכילה15 ASCII characters
. זהו במסגרת המגבלה המותרת ב-Apigee Edge, ולכן התגובה נשלחת בחזרה ללקוח ללא שגיאות על ידי Apigee Edge.- באופן דומה, אם מסתכלים על
faultstring
בהודעת השגיאה שלמעלה, הוא מכיל את"response line size exceeding 2,048"
. הסטטוס הזה מצביע על כך שהיקף ה-Response-Line בתגובת ה-HTTP שנשלח על ידי שרת היעד/הקצה העורפי חרג מ-2,048 בייטים.
הסבר על שורת תגובה גדולה
לפי ההגדרה של Status-Line (נקראת כאן Response-Line) ובקשות ותגובה אופייניות של HTTP, הגודל יהיה קטן בהרבה ממגבלת ברירת המחדל המוגדרת כברירת מחדל ב-Apigee Edge, כך שייתכן שלא נצליח להגיע למגבלה. עם זאת, יש כמה תרחישים אפשריים שבהם תיתכן חריגה ממגבלה זו:
- שרת היעד/הקצה העורפי אינו מערכת HTTP. יכול להיות שהתגובה שמתקבלת היא תגובה שאינה HTTP.
- בשרת היעד/בשרת העורפי יש בעיות והוא שולח 'שורת תגובה' ארוכה כחלק מתגובת ה-HTTP.
ניתן לקרוא מידע נוסף בנושא במאמר קבלת error protocol.http.TooBigLine, "גודל שורת תגובה חורג מ-2,048.
אלה הסיבות האפשריות לשגיאה:
סיבה | תיאור | ההוראות לפתרון בעיות הרלוונטיות עבור |
---|---|---|
הגודל של שורת התגובה חורג מהמגבלה המותרת | גודל ה-Response-Line שנשלח על ידי שרת היעד/הקצה העורפי כחלק מתגובת ה-HTTP ל-Apigee Edge גדול מהמגבלה המותרת ב-Apigee Edge | משתמשי Edge הציבוריים והפרטיים |
שלבים נפוצים באבחון
אפשר להשתמש באחד מהכלים/הטכניקות הבאים כדי לאבחן את השגיאה הזו:
מעקב באמצעות API
כדי לאבחן את השגיאה באמצעות API Monitoring:
- נכנסים לממשק המשתמש של Apigee Edge בתור משתמשים עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף ניתוח > API Monitoring > חקירה.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
- אפשר לבחור במסנן שרת Proxy כדי לצמצם את קוד השגיאה.
- יש להציב את קוד השגיאה ביחס ל-Time.
צריך לבחור תא שמכיל את קוד השגיאה
protocol.http.TooBigLine
כפי שמוצג כאן:המידע על קוד התקלה
protocol.http.TooBigLine
יופיע כפי שמוצג כאן:לוחצים על View Logs (הצגת היומנים) ומרחיבים את השורה של הבקשה שנכשלה.
- בחלון Logs, שימו לב לפרטים הבאים:
- קוד סטטוס:
502
- מקור התקלה:
target
- קוד תקלה:
protocol.http.TooBigLine
.
- קוד סטטוס:
- אם ל-Fault Source יש את הערך
target
ול-Fault Code יש את הערךprotocol.http.TooBigLine
, זה אומר שתגובת ה-HTTP משרת היעד/ הקצה העורפי היא דוגמה לשורת תגובה שגדולה מהמגבלה המקסימלית המותרת ב-Apigee Edge.
כלי המעקב
- מפעילים את הפעלת המעקב
וגם:
- צריך להמתין עד שהשגיאה
502 Bad Gateway
תתרחש, או - אם אפשר לשחזר את הבעיה, יש לבצע את הקריאה ל-API ולשחזר את השגיאה
502 Bad Gateway
.
- צריך להמתין עד שהשגיאה
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- אפשר לנווט בין השלבים השונים של המעקב ולאתר את המיקום שבו אירעה הכשל.
השגיאה תופיע בדרך כלל בשגיאה
flowinfo
מיד אחרי השלב הבקשה נשלחה לשרת היעד, כפי שמוצג כאן:שימו לב לערכי השגיאה מתוך המעקב:
- שגיאה:
response line exceeding 2,048
- error.class:
com.apigee.errors.http.server.BadGateway
המשמעות היא ש-Apigee Edge (רכיב של מעבד הודעות) מקפיץ את השגיאה מיד לאחר קבלת התגובה משרת הקצה העורפי עקב גודל שורת תגובה שחורג מהמגבלה המותרת.
- שגיאה:
הודעת השגיאה שנשלחה ללקוח תופיע בשלב תגובה שנשלחה ללקוח באופן הבא:
- מעיינים בערכים של השגיאה מתוך נתוני המעקב:
- שגיאה:
502 Bad Gateway
. - תוכן השגיאה:
{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
- שגיאה:
אפשר גם לעבור לשלב AX (רישום נתונים ב-Analytics) במעקב וללחוץ עליו כדי לראות את פרטי השגיאה.
חשוב לשים לב לערכים הבאים:
כותרות של בקשות Value X-Apigee-fault-code protocol.http.TooBigLine
X-Apigee-fault-source target
תוכן שגיאה : גוף {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים בענן פרטי, אתם יכולים להשתמש ביומני הגישה של 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 שתואם לערך של X-Apigee-fault-code , צריך לקבוע את הערך של X-Apigee-fault-codeהרשומה לדוגמה שלמעלה מיומן הגישה של NGINX כוללת את הערכים הבאים עבור X- Apigee-fault-code ו-X-Apigee-fault-source:
כותרות תגובה Value X-Apigee-fault-code protocol.http.TooBigLine
X-Apigee-fault-source target
הסיבה: הגודל של שורת התגובה חורג מהמגבלה המותרת
אבחון
- מאתרים את קוד התקלה ואת מקור התקלה של השגיאה שנצפתה באמצעות מעקב API, כלי המעקב או יומני גישה של NGINX, כמו שמוסבר במאמר שלבי האבחון הנפוצים.
- אם ב-Fault Source יש את הערך
target
, המשמעות היא שגודל שורת התגובה שנשלחת על ידי האפליקציה של שרת היעד/הקצה העורפי אל Apigee גדול מהמגבלה המותרת ב-Apigee Edge. אפשר לוודא שגודל שורת התגובה חרג מהמגבלה המותרת של 2 KB באמצעות אחת מהשיטות הבאות:
הודעת השגיאה
כדי לבצע אימות באמצעות הודעת השגיאה:
אם יש לך גישה להודעת השגיאה המלאה שהתקבלה מ-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 K תווי ASCII.אם משתמשים בלקוח אחר, אפשר לבדוק את יומני הלקוח ולנסות לבדוק מה הגודל של שורת התגובה שנשלחת אל Apigee Edge.
יומנים של מעבד ההודעות
לאימות באמצעות יומנים של מעבד ההודעות:
אם אתם משתמשים בענן פרטי, תוכלו להשתמש ביומנים של מעבד ההודעות כדי לבדוק אם גודל שורת התגובה חרג מהמגבלה המותרת ב-Apigee Edge.
- אפשר לאתר את מזהה ההודעה של הבקשה שנכשלה באמצעות API Monitoring, הכלי למעקב או יומני גישה של 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 [מומלץ]: תיקון האפליקציה של שרת היעד/הקצה העורפי כך שלא יישלחו שורות תגובה שגודלן חורג מהמגבלה המותרת
- ניתוח הסיבה שבגללה הלקוח הספציפי שולח שורת תגובה בגודל שחורג מהמגבלה המותרת, כפי שמוגדר ב-Limits.
- אם היא לא רצויה, משנים את האפליקציה של שרת היעד/הקצה העורפי כך שהיא תשלח שורת תגובה שגודלה קטן מהמגבלה המותרת.
- אם ניתן לשלוח שורת תגובה שגודלה חורג מהמגבלה המותרת, עוברים לאפשרויות הבאות.
CwC
אפשרות שנייה: שימוש בנכס CwC כדי להגדיל את המגבלה של שורת התגובה
Apigee מספקת מאפיין מסוג CwC שמאפשר להגדיל את מגבלת הגודל של שורת התגובה. לפרטים נוספים אפשר לקרוא את המאמר הגדרת מגבלת שורת המענה במעבד ההודעות.
מגבלות
Apigee מצפה שאפליקציית הלקוח ושרת הקצה העורפי לא ישלחו בקשות/תשובות עם קווי תגובה שהגדלים שלהם חורגים מהמגבלה המותרת, כפי שמצוין בנושא הגבלה על בקשות/בקשות תגובה במגבלות של Apigee Edge.
- אם אתם משתמשים ב-Public Cloud, המגבלה המקסימלית של גודל הבקשה ושורת התגובה מתועדת בגודל של בקשה/תגובה במגבלות Apigee Edge.
- אם אתם משתמשים בענן פרטי , יכול להיות ששיניתם את מגבלת ברירת המחדל המקסימלית לגודל של בקשה ושורת תגובה (למרות שזו לא שיטה מומלצת). אפשר לקבוע את מגבלת הגודל של שורת התגובה המקסימלית בעזרת ההוראות במאמר איך בודקים את המגבלה הנוכחית.
איך בודקים את המגבלה הנוכחית?
בקטע הזה מוסבר איך לוודא שהמאפיין 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 לענן פרטי היא 2 KB.
אם אתם עדיין זקוקים לעזרה מהתמיכה של Apigee, תוכלו לקרוא את המאמר נדרש איסוף פרטי אבחון.
צריך לאסוף פרטי אבחון
יש לאסוף את פרטי האבחון הבאים ולאחר מכן לפנות לתמיכה של Apigee Edge:
אם אתם משתמשים ב-Public Cloud, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם שרת proxy ל-API
- השלמה של פקודת curl המשמשת לשחזור השגיאה
502
- קובץ מעקב לבקשות API
אם אתם משתמשים בענן פרטי, עליכם לספק את הפרטים הבאים:
- זוהתה הודעת שגיאה מלאה בבקשות שנכשלו
- שם הארגון
- שם הסביבה
- חבילת שרת 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