אתם צופים במסמכי התיעוד של 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 Public Cloud וב-Edge Private Cloud |
שלבים נפוצים לאבחון
כדי לאבחן את השגיאה הזו, אפשר להשתמש באחד מהכלים או מהטכניקות הבאים:
API Monitoring
כדי לאבחן את השגיאה באמצעות הכלי 'מעקב אחר API':
- נכנסים לממשק המשתמש של Apigee Edge בתור משתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.

- עוברים לדף Analyze > API Monitoring > Investigate.
- בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
- מוודאים שהמסנן Proxy מוגדר לAll.
- משרטטים את קוד התקלה מול הזמן.
בוחרים תא עם קוד השגיאה
protocol.http.DuplicateHeaderכמו בדוגמה הבאה:
מוצג מידע על קוד התקלה
protocol.http.DuplicateHeader, כמו בדוגמה הבאה:
- מוודאים שקוד הסטטוס הוא
502, כמו בדוגמה שלמעלה. - לוחצים על הצגת יומנים ומרחיבים את השורה של הבקשה שנכשלה.
בחלון Logs (יומנים), שימו לב לפרטים הבאים:
- קוד סטטוס:
502 - מקור התקלה:
target - קוד שגיאה:
protocol.http.DuplicateHeader.
- קוד סטטוס:
- מקור השגיאה הוא
target, מה שמצביע על כך שהתגובה משרת הקצה העורפי הכילה כותרות כפולות.
כלי המעקב
כדי לאבחן את השגיאה באמצעות הכלי Trace:
- מפעילים את trace session ואת אחת מהאפשרויות הבאות:
- ממתינים להתרחשות השגיאה
502 Bad Gatewayאו - אם אתם מצליחים לשחזר את הבעיה, מבצעים את הקריאה ל-API ומשחזרים את השגיאה
502 Bad Gateway
- ממתינים להתרחשות השגיאה
מוודאים שההגדרה הצגת כל פרטי התהליך מופעלת:

- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- עוברים בין השלבים השונים של ה-trace ומאתרים את המקום שבו התרחשה הכשל.
בדרך כלל השגיאה מופיעה בתהליך אחרי השלב Request sent to target server כמו שמוצג בהמשך:

רושמים את ערך השגיאה מהמעקב.
בדוגמה שלמעלה של רצף הודעות השגיאה, השגיאה מוצגת כ-
Duplicate Header "Expires". השגיאה הזו מופיעה ב-Apigee אחרי שהבקשה נשלחה לשרת העורפי, ולכן היא מציינת שהשרת העורפי שלח את הכותרתExpiresיותר מפעם אחת.- עוברים לשלב AX (נתוני Analytics שתועדו) בנתוני המעקב ולוחצים עליו.
גוללים למטה לקטע Phase Details - Response Headers (פרטי השלב – כותרות תגובה) ומזהים את הערכים של X-Apigee-fault-code (קוד שגיאה של Apigee) ושל X-Apigee-fault-source (מקור השגיאה של Apigee) כמו שמוצג בהמשך:

- הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source
יהיו
protocol.http.DuplicateHeaderו-target, מה שמצביע על כך שהשגיאה הזו נגרמת כי שרת הקצה העורפי העביר כותרות משוכפלות עבור כותרת התגובהExpires.כותרות תגובה ערך X-Apigee-fault-code protocol.http.DuplicateHeaderX-Apigee-fault-source target בודקים אם משתמשים בשרשור של שרתי proxy, כלומר אם שרת היעד או נקודת הקצה של היעד מפעילים שרת proxy אחר ב-Apigee.
כדי לדעת מהו, צריך לחזור לשלב השרת Request sent to target. לוחצים על הצגת Curl.
נפתח החלון Curl for Request Sent to Target Server (Curl לבקשה שנשלחה לשרת היעד), שבו אפשר לקבוע את הכינוי של מארח שרת היעד.
- אם כינוי המארח של שרת היעד מצביע על כינוי של מארח וירטואלי, מדובר בשרשור של שרתי proxy. במקרה כזה, צריך לחזור על כל השלבים שלמעלה עבור שרשרת ה-proxy עד שמגלים מה גורם לשגיאה
502 Bad Gateway. - אם כינוי המארח של שרת היעד מצביע על השרת העורפי, המשמעות היא שהשרת העורפי שולח את הכותרות הכפולות בתגובה ל-Apigee.
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.DuplicateHeader, צריך לקבוע את הערך של X-Apigee-fault-source.דוגמה לשגיאה 502 מיומן הגישה של NGINX:
בדוגמה של רשומה מיומן הגישה של NGINX שמופיעה למעלה, הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source הם:
כותרות תגובה ערך X-Apigee-fault-code protocol.http.DuplicateHeaderX-Apigee-fault-source target
הסיבה: כותרת כפולה בתגובה
אבחון
- כדי לזהות את קוד השגיאה ואת מקור השגיאה של השגיאה שנצפתה, אפשר להשתמש ב'מעקב אחר API' או ביומני הגישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון.
- אם הערך של Fault Source הוא
target, המשמעות היא שהתגובה שנשלחה על ידי שרת היעד מכילה כותרות כפולות. אפשר לקבוע את הכותרת בפועל שנשלחת יותר מפעם אחת כחלק מהתגובה באמצעות אחת מהשיטות הבאות:
הודעת שגיאה
שימוש בהודעת השגיאה:
אם יש לכם גישה להודעת השגיאה המלאה שהתקבלה מ-Apigee Edge, תוכלו לעיין ב
faultstring. השדהfaultstringמכיל את שם הכותרת שנשלחה יותר מפעם אחת.הודעת שגיאה לדוגמה:
"faultstring":"Duplicate Header \"Expires\""
- בהודעת השגיאה שלמעלה אפשר לראות שהכותרת
Expiresנשלחת יותר מפעם אחת, כפי שמוצג ב-faultstring.
הבקשה בפועל
שימוש בבקשה בפועל:
- אם אין לכם גישה לבקשה בפועל שנשלחה לשרת היעד, תוכלו לקבל את הפקודה המתאימה
curlמשלב 10.א ומשלב 10.ב במאמר שימוש בכלי Trace. אם יש לכם גישה לבקשה בפועל שנשלחה לאפליקציית השרת של היעד, אתם יכולים לבצע את השלבים הבאים:
מבצעים שיחה לשרת היעד.
בקשה לדוגמה לשרת היעד שמשמש בדוגמה הזו:
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ולוודא שאין בעיה ששרתי ה-API proxy יקבלו אותה. ברוב המקרים, זה לא רצוי בהתאם למפרט HTTP RFC7230. - אם זה לא רצוי, צריך לשנות את אפליקציית שרת היעד כך שלא יישלחו כותרות כפולות.
בדוגמה שצוינה למעלה, אפשר לראות שהכותרת
Expiresנשלחת פעמיים עם אותו ערך, וזה לא רצוי. כדי לפתור את הבעיה, צריך לוודא ששרת היעד מעביר את הכותרתExpiresרק פעם אחת. - אם רוצים לאפשר את הכותרות הכפולות, אפשר לעבור אל אפשרות 2: שימוש בנכס CwC.
CwC
אפשרות 2: שימוש בנכס CwC
ב-Apigee יש מאפיין CwC HTTPHeader.<HeaderName> ,שמאפשר לאפליקציות לקוח ולשרתי יעד לשלוח כותרות כפולות לשרתי proxy של API ב-Apigee Edge.
| נכס CwC | ערכים |
|---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
לדוגמה, אפשר להגדיר את המאפיין הבא במעבדי ההודעות כדי לאפשר כפילויות וכמה ערכים בכותרת Expires.
HTTPHeader.Expires=allowDuplicates, multiValued
- אם אתם משתמשי Private Cloud, אתם יכולים להגדיר את המאפיין כדי למנוע מ-Apigee Edge להציג שגיאת
502 Bad Gateway, גם אם הבקשה מכילה כותרות כפולות. לשם כך, תוכלו להיעזר במדריך הגדרת מעבדי הודעות לשימוש בכותרות כפולות. - אם אתם משתמשים ב-Public Cloud, אתם יכולים לפנות אל התמיכה של Apigee Edge כדי להגדיר את המאפיין הזה לארגון שלכם.
מפרט
Apigee מגיב עם תגובת השגיאה 502 Bad Gateway כי הוא מצפה שהשרת העורפי יתנהג בהתאם למפרטים הבאים של RFC:
| מפרט |
|---|
| RFC 7230, section 3.2.2: Field Order |
| RFC 7230, section 3.2: Header Fields |
אם עדיין דרושה לך עזרה מצוות התמיכה של Apigee, אפשר לעבור אל איסוף מידע לצורך אבחון.
צריך לאסוף פרטי אבחון
אוספים את נתוני האבחון הבאים ופונים אל התמיכה של Apigee Edge.
אם אתם משתמשי ענן ציבורי, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם ה-proxy ל-API
- הפקודה
curlשבה השתמשת כדי לשחזר את השגיאה502 - קובץ מעקב לבקשות ה-API
אם אתם משתמשים ב-Private Cloud, עליכם לספק את הפרטים הבאים:
- הודעת השגיאה המלאה שזוהתה בבקשות שנכשלו
- שם הסביבה
- חבילת 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