מוצג המסמך של 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 UI כמשתמש עם התפקיד המתאים.
עוברים לארגון שבו רוצים לחקור את הבעיה.
- מנווטים אל ניתוח > מעקב API > לחקור את הדף.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
- מוודאים שהמסנן של שרת ה-proxy מוגדר לאפשרות All.
- הציגו את קוד התקלה ביחס ל-Time.
צריך לבחור תא עם קוד השגיאה
protocol.http.DuplicateHeader
, כמו בדוגמה הבאה:מידע על קוד התקלה
protocol.http.DuplicateHeader
מוצג כך:- יש לוודא שקוד הסטטוס הוא
502
כפי שמוצג בדוגמה שלמעלה. - לוחצים על הצגת היומנים ומרחיבים את השורה של הבקשה שנכשלה.
בחלון היומנים, שימו לב לפרטים הבאים:
- קוד סטטוס:
502
- מקור התקלה:
target
- קוד התקלה:
protocol.http.DuplicateHeader
.
- קוד סטטוס:
- מקור התקלה הוא
target
, שמציין שהתגובה משרת הקצה העורפי הכילה כותרות כפולות.
כלי המעקב
כדי לאבחן את השגיאה באמצעות כלי המעקב:
- להפעיל את סשן המעקב ואז
- יש להמתין עד שהשגיאה
502 Bad Gateway
תתבצע, או - אם הצלחת לשחזר את הבעיה, יש לבצע את הקריאה ל-API ולשחזר את
שגיאה אחת (
502 Bad Gateway
)
- יש להמתין עד שהשגיאה
מוודאים שהאפשרות הצגת כל פרטי הזרימה מופעלת:
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- צריך לעבור בין השלבים השונים במעקב ולאתר את מקום הכשל.
השגיאה בדרך כלל מופיעה בתהליך אחרי הבקשה נשלחה ליעד שרת כפי שמוצג בהמשך:
בודקים את ערך השגיאה במעקב.
במעקב הדוגמה שלמעלה מוצגת השגיאה כ-
Duplicate Header "Expires"
. מאז כש-Apigee מעלה את השגיאה אחרי שהבקשה נשלחה לשרת העורפי, היא מציינת ששרת הקצה העורפי שלח את הכותרתExpires
יותר מפעם אחת.- מנווטים לשלב AX (נתוני Analytics מתועדים) במעקב ולוחצים עליו.
גוללים למטה לקטע פרטי שלב – כותרות של תגובות ומזהים את של X-Apigee-fault-code ו-X-Apigee-fault-source כפי שמוצג כאן:
- יופיעו הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source.
protocol.http.DuplicateHeader
ו-target
, מה שמציין שגיאה זו מתרחשת מכיוון שכותרות כפולות הועברו על ידי שרת הקצה העורפי עבור כותרת תגובהExpires
.כותרות של תשובות ערך X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
בדיקה אם משתמשים שרשרת לשרת proxy; כלומר, אם שרת היעד או נקודת הקצה (endpoint) של היעד מפעילים שרת proxy אחר ב-Apigee.
כדי לבדוק זאת, חוזרים לשלב הבקשה נשלחה ליעד בשרת. לוחצים על Show Curl (הצגת Curl).
החלון Curl for Request Sent to target Server (מספר בקשה שנשלחה לשרת היעד) נפתח שממנו אפשר לקבוע את הכינוי של שרת היעד.
- אם הכינוי של המארח של שרת היעד מפנה אל כינוי מארח וירטואלי, מדובר בשרת 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 תואם לערך שלprotocol.http.DuplicateHeader
, אז לקבוע את הערך של X-Apigee-fault-source.שגיאה 502 ביומן הגישה ל-NGINX:
הרשומה לדוגמה שלמעלה מיומן הגישה של NGINX כוללת את הערכים הבאים עבור X- Apigee-fault-code ו-X-Apigee-fault-source:
כותרות של תשובות ערך X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
הסיבה: כותרת כפולה בתגובה
אבחון
- מגדירים את קוד השגיאה ואת מקור התקלה של השגיאה שזוהתה באמצעות ה-API יומני מעקב או יומני גישה ל-NGINX, כמו שמוסבר בשלבי האבחון הנפוצים.
- אם מקור התקלה מכיל את הערך
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>
,שמאפשר לאפליקציות לקוח ולטרגט
לשרתים לשלוח כותרות כפולות לשרתי proxy ל-API ב-Apigee Edge.
נכס CwC | ערכים |
---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
לדוגמה, אפשר להגדיר את המאפיין הבא במעבדי ההודעות כדי לאפשר כפילויות
ומספר ערכים לכותרת Expires
.
HTTPHeader.Expires=allowDuplicates, multiValued
- אם אתם משתמשים בענן פרטי, תוכלו להגדיר את הנכס כדי למנוע את השימוש ב-Apigee
Edge מהצגת השגיאה
502 Bad Gateway
, גם אם הבקשה מכילה כותרות כפולות באמצעות מגדירים את מעבדי ההודעות לשימוש בכותרות כפולות. - אם אתם משתמשים בענן ציבורי, עליכם לפנות לתמיכה של Apigee Edge כדי להגדיר זאת לנכס של הארגון שלך.
מפרט
Apigee מגיבה עם תגובת השגיאה 502 Bad Gateway
כי היא מצפה
שרת קצה עורפי יפעל בהתאם למפרטי RFC הבאים:
מפרט |
---|
RFC 7230, סעיף 3.2.2: סדר שדות |
RFC 7230, סעיף 3.2: שדות כותרת |
אם עדיין דרושה לך עזרה מהתמיכה של Apigee, צריך לעבור אל חובה לאסוף את פרטי האבחון.
חובה לאסוף פרטי אבחון
עליכם לאסוף את פרטי האבחון הבאים ואז לפנות לתמיכה של Apigee Edge.
אם אתם משתמשים ב-Public Cloud, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם ה-API של ה-Proxy
- צריך להשלים את הפקודה
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