אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X. מידע
תיאור הבעיה
אפליקציית הלקוח מקבלת קוד סטטוס של HTTP 502 Bad Gateway עם הקוד ECONNRESET כתגובה לקריאות ל-API ב-Edge Microgateway.
הודעת שגיאה
הלקוח יראה את קוד התגובה הבא:
HTTP/1.1 502 Bad Gateway
התשובה תכלול את הודעת השגיאה הבאה:
{"message":"socket hang up","code":"ECONNRESET"}גורמים אפשריים
| סיבה | תיאור | הוראות לפתרון בעיות שרלוונטיות ל |
|---|---|---|
| הגדרת זמן קצוב לתפוגה של Keep-Alive שגויה | הגדרת פסק זמן שגוי של Keep-alive בין Edge Microgateway לבין שרת היעד. | משתמשים ב-Edge Public Cloud וב-Edge Private Cloud |
| שרת היעד סוגר את החיבור לפני הזמן | שרת היעד סוגר את החיבור לפני הזמן בזמן ש-Edge Microgateway שולח את מטען הבקשה. | משתמשים ב-Edge Public Cloud וב-Edge Private Cloud |
שלבים נפוצים לאבחון
- בודקים את היומנים של Edge Microgateway:
/var/tmp/edgemicro-`hostname`-*.log
- מחפשים אם יש שגיאות
502עם קודECONNRESETבמהלך פרק זמן מסוים (אם הבעיה קרתה בעבר) או אם יש בקשות שעדיין נכשלות עם502.2021-06-23T03:52:24.110Z [error][0:8000][3][myorg][test] [emg_badtarget/flakey/hangup][][][6b089a00-d3d6-11eb-95aa-911f1ee6c684] [microgateway-core][][GET][502][socket hang up][ECONNRESET][]
- אם רמת הרישום ביומן מוגדרת ל-
warnאו ל-info, יופיע גם המסר[warn]שכולל את שם המארח של שרת היעד והיציאה ברכיב השני. בדוגמה הזו, זהוX.X.X.X:8080, ואפשר להשתמש בו מאוחר יותר כדי ללכוד אתtcpdump.2021-06-23T03:52:24.109Z [warn][X.X.X.X:8080][3][myorg][test][emg_badtarget/flakey/hangup] [][][6b089a00-d3d6-11eb-95aa-911f1ee6c684][plugins-middleware] [targetRequest error][GET][][socket hang up][ECONNRESET][395]
- קוד השגיאה
[socket hang up][ECONNRESET]מציין ששרת היעד סגר את החיבור עם Edge Microgateway. אפשר לחפש את השגיאה ביומנים כדי לדעת כמה פעמים היא מתרחשת.
הסיבה: הגדרה שגויה של הזמן הקצוב לתפוגה של הודעת keep-alive
אבחון
- פועלים לפי השלבים שבקטע שלבי אבחון נפוצים ובודקים אם קיבלתם את השגיאה
[socket hang up][ECONNRESET]. אם כן, כדאי להמשיך לבדוק את הנושא בעזרת
tcpdump, כמו שמוסבר בהמשך:
שימוש ב-tcpdump
- מריצים את הפקודה הבאה כדי ללכוד
tcpdumpבין Edge Microgateway לבין שרת הקצה העורפי במערכת ההפעלה של המארח של Edge Microgateway:tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
- ניתוח הנתונים ש
tcpdumpנאספו:פלט לדוגמה של tcpdump: ( הצגת תמונה גדולה יותר)
בדוגמה שלמעלה
tcpdump, אפשר לראות את הפרטים הבאים:- במנה 250288, הלקוח שולח בקשה מסוג
POST. - בחבילה 250371, השרת משיב עם
200 OK. - במנה 250559, הלקוח שולח
ACK. - בחבילה 250560, השרת שולח את ההודעה
Continuation. - במנה 250561, הלקוח שולח
ACK. - בחבילה 262436, השרת שולח
FIN, ACKללקוח שיוזם את סגירת החיבור. שימו לב שזה בערך חמש שניות אחרי המנה הקודמת (250561). - במנה 262441, הלקוח שולח בקשה נוספת של
POST. עם זאת, הפעולה נכשלת כי השרת כבר התחיל לסגור את החיבור. התשובה היאRSTבחבילה 262441.
באותו חיבור נעשה שימוש חוזר לפחות פעם אחת בהצלחה בדוגמה הזו, אבל בבקשה הסופית, השרת יוזם סגירה של החיבור אחרי חמש שניות של זמן השהיה, שמתרחשת באותו זמן שבו הלקוח שלח בקשה חדשה. המשמעות היא שסביר להניח שזמן הקצוב לתפוגה של הודעת keep-alive בשרת העורפי קצר יותר מהערך שהוגדר בלקוח או שווה לו. כדי לוודא את זה, אפשר לעיין במאמר השוואה בין הזמן הקצוב לתפוגה של הודעת keep-alive ב-Edge Microgateway ובשרת הקצה העורפי.
- במנה 250288, הלקוח שולח בקשה מסוג
השוואה בין פסק זמן של שמירת חיבור פעיל
- ל-Edge Microgateway אין מאפיין ספציפי של זמן קצוב לתפוגה של הודעת keep-alive. הערך נקבע לפי מערכת ההפעלה שבה הוא פועל. דוגמאות נפוצות הן Windows, Linux וקונטיינרים של Docker.
- יכול להיות שההגדרה הזו מותאמת אישית במערכת ההפעלה. צריך לפנות לאדמין. כברירת מחדל, מערכות הפעלה של Linux כוללות פסק זמן של שעתיים לחיבור פעיל.
- לאחר מכן, בודקים את מאפיין הזמן הקצוב לתפוגה של הודעת keep-alive שהוגדר בשרת הקצה העורפי. נניח שהשרת העורפי מוגדר עם ערך של 10 שניות.
- אם קובעים שערך הזמן הקצוב לתפוגה של הודעת keep-alive במערכת ההפעלה גבוה יותר מערך המאפיין של הזמן הקצוב לתפוגה של הודעת keep-alive בשרת הקצה העורפי, כמו בדוגמה שלמעלה, אז זה הגורם לשגיאות
502.
רזולוציה
חשוב לוודא שערך המאפיין של הזמן הקצוב לתפוגה של הודעת keep-alive תמיד נמוך יותר במערכת ההפעלה שבה פועל Edge Microgateway בהשוואה לערך שלו בשרת העורפי.
- קובעים את הערך שהוגדר לזמן הקצוב לתפוגה של שמירת החיבור בשרת העורפי.
- מגדירים ערך מתאים למאפיין הזמן הקצוב לתפוגה של הודעת keep-alive במערכת ההפעלה, כך שהערך של מאפיין הזמן הקצוב לתפוגה של הודעת keep-alive יהיה נמוך מהערך שהוגדר בשרת בק-אנד, באמצעות השלבים שרלוונטיים למערכת ההפעלה שלכם.
שיטה מומלצת
מומלץ מאוד שהרכיבים במורד הזרם תמיד יכללו סף נמוך יותר של זמן קצוב לתפוגה של הודעות keep-alive בהשוואה לשרתים במעלה הזרם, כדי למנוע מרוץ תהליכים ושגיאות מסוג 502. כל קפיצה במורד הזרם צריכה להיות נמוכה מכל קפיצה במעלה הזרם. ב-Edge
Microgateway, מומלץ לפעול לפי ההנחיות הבאות:
הזמן הקצוב לתפוגה של הודעת keep-alive באפליקציית הלקוח או במאזן העומסים צריך להיות קצר יותר מהזמן הקצוב לתפוגה של הודעת keep-alive ב-Edge Microgateway.
כדי להגדיר את הזמן הקצוב לתפוגה של הודעת keep-alive ב-Edge Microgateway, מוסיפים את הערך
keep_alive_timeoutלקובץ~/.edgemicro/org-env-config.yaml.edgemicro: keep_alive_timeout: 65000
- הזמן הקצוב לתפוגה של מערכת ההפעלה Edge Microgateway צריך להיות קצר יותר מהזמן הקצוב לתפוגה של שרת היעד.
- אם יש לכם עוד קפיצות לפני או אחרי Edge Microgateway, צריך להחיל את אותו כלל. תמיד צריך להשאיר את האחריות לסגירת החיבור עם השרת ללקוח במורד הזרם.
הסיבה: שרת היעד סוגר את החיבור לפני הזמן
אבחון
- פועלים לפי השלבים שמוסברים במאמר שלבים נפוצים לאבחון ובודקים אם קיבלתם את השגיאה
[socket hang up][ECONNRESET]. - אם כן, כדאי להמשיך לבדוק את העניין בעזרת
tcpdumpכמו שמוסבר בהמשך.הודעת השגיאה
[targetRequest error][GET][][socket hang up][ECONNRESET]בדוגמה שלמעלה מציינת שהשגיאה הזו התרחשה בזמן ש-Edge Microgateway שלח את הבקשה לשרת העורפי (היעד). כלומר, Edge Microgateway שלח את בקשת ה-API לשרת הקצה העורפי והמתין לתגובה. עם זאת, שרת הקצה העורפי סגר את החיבור באופן פתאומי לפני ש-Edge Microgateway קיבל תגובה. - בודקים את יומני השרת של העורף כדי לראות אם יש שגיאות או מידע שיכלו לגרום לשרת העורף לסיים את החיבור באופן פתאומי. אם מופיעות שגיאות או פרטים, עוברים אל פתרון הבעיה ומתקנים את הבעיה בשרת העורפי.
- אם לא מצאתם שגיאות או מידע בשרת העורפי, אוספים את הפלט
tcpdumpבשרת Edge Microgateway:tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
- ניתוח הנתונים ש
tcpdumpנאספו:פלט לדוגמה של tcpdump: ( הצגת תמונה גדולה יותר)
בדוגמה שלמעלה
tcpdump, אפשר לראות את הפרטים הבאים:- בחבילה 4, Edge Microgateway שלח בקשת
GETלשרת היעד. - במנה 5, שרת היעד הגיב עם
ACKכדי לאשר את הבקשה. - אבל בחבילה 6, במקום להגיב עם מטען תגובה, שרת היעד שולח
FIN, ACKשמתחיל את סגירת החיבור. - החל מחבילה 7, החיבור נסגר באופן הדדי. החיבור נסגר לפני שהתגובה נשלחה, ולכן Edge Microgateway יחזיר את שגיאת ה-HTTP
502ללקוח. - שימו לב שחותמת הזמן של חבילת 8,
2021-06-23T03:52:24.110Zתואמת לחותמת הזמן שבה השגיאה נרשמה ביומני Edge Microgateway. לעתים קרובות אפשר להשתמש בחותמות הזמן בקובצי היומן ובtcpdumpכדי לקשר בין השגיאות לבין החבילות בפועל.
רזולוציה
מתקנים את הבעיה בשרת העורפי בהתאם.
אם הבעיה נמשכת ואתם צריכים עזרה בפתרון בעיות ב-
502 Bad Gateway Errorאו שאתם חושדים שמדובר בבעיה ב-Edge Microgateway, כדאי לעבור אל איסוף מידע לצורך אבחון.צריך לאסוף פרטי אבחון
אם הבעיה נמשכת גם אחרי שמבצעים את ההוראות שלמעלה, צריך לאסוף את פרטי האבחון הבאים ואז לפנות לתמיכה של Apigee Edge:
- קובצי יומן: תיקיית ברירת המחדל היא
/var/tmp, אבל יכול להיות שהיא תוחלף בקובץ הראשיconfig.yaml(logging > dir parameter). מומלץ לשנות אתlog > levelל-infoלפני שמעבירים את קובצי היומן לתמיכה של Apigee. - קובץ תצורה: התצורה העיקרית של Edge Microgateway נמצאת בקובץ ה-YAML בתיקייה של Edge Microgateway שמוגדרת כברירת מחדל,
$HOME/.edgemicro. יש קובץ תצורה שמוגדר כברירת מחדל שנקראdefault.yaml, ועוד קובץ לכל סביבהORG-ENV-config.yaml. עליך להעלות את הקובץ הזה במלואו עבור הארגון והסביבה שהושפעו.
- בחבילה 4, Edge Microgateway שלח בקשת