כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של
Apigee X. מידע
תיאור הבעיה
אפליקציית הלקוח מקבלת קוד סטטוס HTTP של 502 Bad Gateway
עם קוד השגיאה protocol.http.DuplicateHeader
כתגובה לקריאות ל-API.
הודעת השגיאה
אפליקציית הלקוח מקבלת את קוד התגובה הבא:
HTTP/1.1 502 Bad Gateway
בנוסף, ייתכן שתופיע הודעת שגיאה שדומה לזו:
{ "fault":{ "faultstring":"Duplicate Header \"Expires\"", "detail":{ "errorcode":"protocol.http.DuplicateHeader" } } }
סיבות אפשריות
השגיאה הזו מתרחשת כשכותרת HTTP ספציפית שלא יכולה לכלול כפילויות ב-Apigee Edge מופיעה יותר מפעם אחת עם ערכים זהים או שונים, כחלק מתגובת ה-HTTP שנשלחת על ידי שרת הקצה העורפי אל Apigee Edge.
בהתאם ל
RFC 7230, סעיף 3.2.2: סדר שדות, שולח לא יכול ליצור שדות כותרת מרובים
עם אותו שם שדה בהודעה, אלא אם הערך המלא של שדה הכותרת מוגדר כרשימה שמופרדת בפסיקים, כלומר #(values)] או שדה הכותרת הוא חריג ידוע. אם ב-Apigee Edge מוצגת כותרת ספציפית שלא יכולה לכלול כפילויות, היא נשלחת יותר מפעם אחת בתגובת HTTP שנשלחת על ידי שרת היעד/השרת העורפי,
התגובה נשלחת עם קוד השגיאה 502 Bad Gateway
וקוד שגיאה
protocol.http.DuplicateHeader
אלה הסיבות האפשריות לשגיאה הזו:
סיבה | התיאור | ההוראות לפתרון בעיות הרלוונטיות עבור |
---|---|---|
כותרת כפולה בתשובה | התגובה משרת הקצה העורפי מכילה כותרות כפולות. | משתמשי Edge הציבוריים והפרטיים |
שלבים נפוצים באבחון
אפשר להשתמש באחד מהכלים/הטכניקות הבאים כדי לאבחן את השגיאה הזו:
מעקב באמצעות API
כדי לאבחן את השגיאה באמצעות API Monitoring:
- נכנסים לממשק המשתמש של Apigee Edge בתור משתמשים עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף ניתוח > API Monitoring > חקירה.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
- מוודאים שמסנן שרת ה-Proxy מוגדר לערך הכול.
- יש להציב את קוד השגיאה ביחס ל-Time.
צריך לבחור תא שמכיל את קוד השגיאה
protocol.http.DuplicateHeader
כפי שמוצג כאן:מידע על קוד התקלה
protocol.http.DuplicateHeader
מוצג באופן הבא:- מוודאים ש-Status Code (קוד הסטטוס) הוא
502
כפי שמוצג בדוגמה שלמעלה. - לוחצים על View Logs (הצגת היומנים) ומרחיבים את השורה של הבקשה שנכשלה.
בחלון 'יומנים', שימו לב לפרטים הבאים:
- קוד סטטוס:
502
- מקור התקלה:
target
- קוד תקלה:
protocol.http.DuplicateHeader
.
- קוד סטטוס:
- מקור התקלה הוא
target
, שמציין שהתגובה משרת הקצה העורפי הכילה כותרות כפולות.
כלי המעקב
כדי לאבחן את השגיאה באמצעות כלי המעקב:
- מפעילים את סשן המעקב ואז
- צריך להמתין עד שהשגיאה
502 Bad Gateway
תתרחש, או - אם אפשר לשחזר את הבעיה, יש לבצע את הקריאה ל-API ולשחזר את
השגיאה
502 Bad Gateway
- צריך להמתין עד שהשגיאה
יש לוודא שהאפשרות הצג את כל פרטי הזרימה מופעלת:
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- אפשר לנווט בשלבים השונים של המעקב ולאתר את המיקום שבו אירעה הכשל.
השגיאה תוצג בדרך כלל ברצף אחרי השלב הבקשה שנשלחה לשרת היעד, כפי שמוצג כאן:
יש לשים לב לערך השגיאה מתוך המעקב.
המעקב לדוגמה שלמעלה מציג את השגיאה כ-
Duplicate Header "Expires"
. מכיוון שהשגיאה הועלתה על ידי Apigee אחרי שהבקשה נשלחה לשרת הקצה העורפי, היא מציינת ששרת הקצה העורפי שלח את הכותרתExpires
יותר מפעם אחת.- עוברים לשלב AX (רישום נתונים ב-Analytics) במעקב ולוחצים עליו.
גוללים למטה לקטע Phase Details – Response Headers ומוצאים את הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source, כפי שמוצג בהמשך:
- הערכים של X-Apigee-fault-code ושל X-Apigee-fault-source יופיעו כ-
protocol.http.DuplicateHeader
ו-target
, כדי לציין שהשגיאה הזו נגרמת כי שרת הקצה העורפי העביר כותרות כפולות עבור כותרת התגובהExpires
.כותרות תגובה Value X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
צריך לבדוק אם משתמשים בשרשור proxy. כלומר, אם שרת היעד או נקודת הקצה של היעד מפעילים שרת proxy אחר ב-Apigee.
כדי לבדוק זאת, חוזרים לשלב הבקשה נשלחה לשרת היעד. לוחצים על Show Curl (הצגת כתובת ה-URL).
החלון Curl for Request sent to Target שליחה נפתח, שבו אפשר לקבוע את הכינוי של שרת היעד כמארח.
- אם הכינוי של שרת היעד מפנה אל כינוי מארח וירטואלי, מדובר בשרשור של
שרת proxy. במקרה כזה, צריך לחזור על כל השלבים שלמעלה בשביל שרת ה-proxy המשורשר עד
שמבינים מה גורם בפועל לשגיאה
502 Bad Gateway
. - אם הכינוי של שרת היעד מפנה לשרת הקצה העורפי שלך, פירוש הדבר הוא ששרת הקצה העורפי שולח את הכותרות הכפולות בתגובה ל-Apigee.
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שגיאה 502 לדוגמה ביומן הגישה של NGINX:
הרשומה לדוגמה שלמעלה מיומן NGINX Access כוללת את הערכים הבאים עבור X- Apigee-fault-code ו-X-Apigee-fault-source:
כותרות תגובה Value X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
הסיבה: כותרת כפולה בתגובה
אבחון
- מאתרים את קוד התקלה ואת מקור התקלה של השגיאה שזוהתה באמצעות יומני API Monitoring או יומני הגישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון.
- אם מקור ה-Fault כולל את הערך
target
, זה אומר שהתגובה שנשלחת על ידי שרת היעד מכילה כותרות כפולות. אפשר לקבוע מהי הכותרת שנשלחת בפועל יותר מפעם אחת כחלק מהתגובה באחת מהשיטות הבאות:
הודעת השגיאה
באמצעות הודעת השגיאה:
אם יש לך גישה להודעת השגיאה המלאה שהתקבלה מ-Apigee Edge, כדאי לעיין ב-
faultstring
. השדהfaultstring
מכיל את שם הכותרת שנשלח יותר מפעם אחת.הודעת שגיאה לדוגמה:
"faultstring":"Duplicate Header \"Expires\""
- בהודעת השגיאה שלמעלה, ניתן לראות שהכותרת
Expires
נשלחה יותר מפעם אחת כפי שניתן לראות ב-faultstring
.
בקשה בפועל
באמצעות הבקשה עצמה:
- אם אין לכם גישה לבקשה שנשלחה בפועל לשרת היעד, צריך לקבל את
פקודת ה-
curl
המתאימה מהשימוש בכלי המעקב משלב 10.א ומשלב 10.ב. אם יש לך גישה לבקשה שנשלחה בפועל לאפליקציית שרת היעד, עליך לבצע את השלבים הבאים:
ביצוע קריאה לשרת היעד.
בקשה לדוגמה לשרת היעד שמשמשת בדוגמה הזו:
curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
מאמתים את רשימת הכותרות שמופיעות בתגובה.
תגובה לדוגמה משרת היעד שבה נעשה שימוש בדוגמה הזו:
* ...Trimmed... > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2 > Host: BACKEND_SERVER_HOST > User-Agent: curl/7.64.1 > Accept: */* > * Connection state changed (MAX_CONCURRENT_STREAMS == 128)! < HTTP/2 200 < date: Fri, 02 Jul 2021 05:29:07 GMT < content-type: application/json < content-length: 166 < server: gunicorn/19.9.0 < Expires: Mon, 21 June 2021 07:28:00 GMT < Expires: Mon, 21 June 2021 07:28:00 GMT < access-control-allow-origin: * < access-control-allow-credentials: true < ----<Response BODY>------ * Connection #0 to host httpbin.org left intact * Closing connection 0
בבקשה לדוגמה שלמעלה, הכותרת
Expires
נשלחת יותר מפעם אחת. לכן, הבקשה הזו נכשלת עם השגיאה502 Bad Gateway
וקוד השגיאה:protocol.http.DuplicateHeader
.אם הכותרת ששמה מופיע ב-
faultstring
מופיע יותר מפעם אחת בתגובה של השרת העורפי, זו הסיבה לשגיאה. במקרה שלמעלה, הכותרתExpires
נשלחת יותר מפעם אחת.
רזולוציה
תיקון הכפילויות
אפשרות מס' 1 [אפשרות מומלצת] תיקון השרת בקצה העורפי כך שלא יכלול כותרות כפולות
- צריך לנתח את הסיבה שבגללה שרת הקצה העורפי הספציפי שולח את הכותרת הכפולה
Expires
ולוודא ששרתי ה-proxy של ה-API יכולים לקבל אותה. ברוב המקרים, הוא לא יהיה רצוי בהתאם למפרט ה-HTTP RFC7230. - אם הוא לא רצוי, משנים את אפליקציית שרת היעד כך שלא תשלח כותרות כפולות.
בדוגמה שלמעלה, ניתן לראות שהכותרת
Expires
נשלחת פעמיים עם אותו ערך, והדבר אינו רצוי. אפשר לתקן את הבעיה על ידי כך ששרת היעד מעביר את הכותרתExpires
פעם אחת בלבד. - אם הוא רצוי ורוצים לאפשר שימוש בכותרות כפולות, עוברים אל אפשרות מס' 2 שימוש בנכס CwC.
CwC
אפשרות מס' 2 – שימוש בנכס CwC
Apigee מספקת מאפיין מסוג CwC
HTTPHeader.<HeaderName>
,שמאפשר לאפליקציות לקוח ולשרתי יעד לשלוח כותרות כפולות לשרתי API של API ב-Apigee Edge.
נכס CwC | ערכים |
---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
לדוגמה, אפשר להגדיר את המאפיין הבא במעבדי ההודעות כדי לאפשר כפילויות וערכים מרובים עבור הכותרת Expires
.
HTTPHeader.Expires=allowDuplicates, multiValued
- למשתמשים בענן פרטי יש אפשרות להגדיר את המאפיין כדי למנוע מ-Apigee Edge להעלות את השגיאה
502 Bad Gateway
, גם אם הבקשה מכילה כותרות כפולות באמצעות המדריך הגדרה של מעבדי הודעות לשימוש בכותרות כפולות. - אם אתם משתמשים ב-Public Cloud, תוכלו לפנות לתמיכה של Apigee Edge כדי להגדיר את הנכס הזה לארגון שלכם.
מפרט
Apigee מגיב עם תגובת השגיאה 502 Bad Gateway
כי הוא מצפה
ששרת הקצה העורפי יפעל בהתאם למפרטי RFC הבאים:
מפרט |
---|
RFC 7230, סעיף 3.2.2: סדר שדות |
RFC 7230, סעיף 3.2: שדות כותרת |
אם עדיין דרושה לכם עזרה מהתמיכה של Apigee, כדאי לעיין במאמר צריך לאסוף פרטי אבחון.
צריך לאסוף פרטי אבחון
עליך לאסוף את פרטי האבחון הבאים ולאחר מכן לפנות לתמיכה של Apigee Edge.
אם אתם משתמשים ב-Public Cloud, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם שרת proxy ל-API
- צריך להשלים את הפקודה
curl
שמשמשת לשחזור השגיאה502
- קובץ מעקב לבקשות API
אם אתם משתמשים בענן פרטי, עליכם לספק את הפרטים הבאים:
- זוהתה הודעת שגיאה מלאה בבקשות שנכשלו
- שם הסביבה
- חבילת proxy ל-API
- קובץ מעקב לבקשות API
יומני הגישה של 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