אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X. מידע
תיאור הבעיה
אפליקציית הלקוח מקבלת קוד סטטוס של HTTP 502 Bad Gateway עם קוד השגיאה protocol.http.Response405WithoutAllowHeader כתגובה לקריאות ל-API.
הודעת שגיאה
אפליקציית הלקוח מקבלת את קוד התגובה הבא:
HTTP/1.1 502 Bad Gateway
בנוסף, יכול להיות שתופיע הודעת השגיאה הבאה:
{
"fault":{
"faultstring":"Received 405 Response without Allow Header",
"detail":{
"errorcode":"protocol.http.Response405WithoutAllowHeader"
}
}
}גורמים אפשריים
השגיאה הזו מתרחשת אם שרת הקצה העורפי מגיב עם קוד סטטוס 405 Method Not Allowed ללא הכותרת Allow.
בהתאם למפרט
RFC 7231, סעיף 6.5.5: 405 Method Not Allowed, שרת המקור אמור ליצור ולשלוח שדה כותרת Allow בתגובה 405 שמכילה רשימה של השיטות שמשאב היעד תומך בהן כרגע. אם לא, Apigee מגיב עם 502 Bad Gateway וקוד השגיאה protocol.http.Response405WithoutAllowHeader.
| סיבה | תיאור | הוראות לפתרון בעיות שרלוונטיות ל |
|---|---|---|
| תגובה 405 ללא כותרת Allow משרת הקצה העורפי | שרת הקצה העורפי שמטפל בבקשת ה-API מגיב עם קוד הסטטוס 405 בלי הכותרת Allow. |
משתמשים ב-Edge Public Cloud וב-Edge Private Cloud |
שלבים נפוצים לאבחון
כדי לאבחן את השגיאה הזו, אפשר להשתמש באחד מהכלים או מהטכניקות הבאים:
API Monitoring
כדי לאבחן את השגיאה באמצעות הכלי 'מעקב אחר API':
- מתחברים לממשק המשתמש של Edge בתור משתמש עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף Analyze > API Monitoring > Investigate.
- בוחרים את מסגרת הזמן הספציפית שבה נתקלת בשגיאות.
משרטטים את קוד התקלה מול הזמן.
בוחרים תא עם קוד השגיאה
protocol.http.Response405WithoutAllowHeaderכמו בדוגמה הבאה:
מוצג מידע על קוד התקלה
protocol.http.Response405WithoutAllowHeaderכמו בדוגמה הבאה:
לוחצים על הצגת יומנים ומרחיבים אחת מהבקשות שנכשלו כדי לראות מידע נוסף.
- בחלון יומנים, רושמים את הפרטים הבאים:
- קוד סטטוס:
502 - מקור התקלה:
target - קוד שגיאה:
protocol.http.Response405WithoutAllowHeader.
- קוד סטטוס:
- אם מקור השגיאה הוא
targetוקוד השגיאה הואprotocol.http.Response405WithoutAllowHeader, המשמעות היא ששרת הקצה העורפי הגיב עם קוד סטטוס405 Method Not Allowedללא הכותרתAllow.
כלי המעקב
כדי לאבחן את השגיאה באמצעות הכלי Trace:
- מפעילים את
trace session ואת אחת מהאפשרויות הבאות:
- ממתינים להתרחשות השגיאה
502 Bad Gateway, או - אם אתם מצליחים לשחזר את הבעיה, מבצעים את הקריאה ל-API כדי לשחזר את השגיאה [מספר השגיאה]
502 Bad Gateway
- ממתינים להתרחשות השגיאה
מוודאים שהאפשרות הצגת כל פרטי הזרימה מופעלת:
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- עוברים בין השלבים השונים של ה-trace ומאתרים את המקום שבו התרחשה הכשל.
בדרך כלל השגיאה מופיעה בתהליך אחרי השלב Request sent to target server (הבקשה נשלחה לשרת היעד), כמו שמוצג בהמשך:
רושמים את ערך השגיאה מהמעקב.
בדוגמה שלמעלה של רצף הודעות השגיאה, השגיאה מוצגת כ-
Received 405 Response without Allow Header. השגיאה הזו מופקת על ידי Apigee אחרי שהבקשה נשלחה לשרת הקצה העורפי, ולכן היא מציינת ששרת הקצה העורפי שלח את קוד סטטוס התגובה405בלי הכותרתAllow.- עוברים לשלב AX (נתוני Analytics שתועדו) בנתוני המעקב ולוחצים עליו.
גוללים למטה לקטע Error / Response Headers (שגיאה / כותרות תגובה) בחלונית Phase Details (פרטי השלב) וקובעים את הערכים של X-Apigee-fault-code (קוד תקלה של Apigee) ו-X-Apigee-fault-source (מקור התקלה של Apigee) כמו שמוצג בהמשך:
- הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source יהיו
protocol.http.Response405WithoutAllowHeaderו-targetבהתאמה, מה שמצביע על כך שהשגיאה הזו נגרמת כי ה-backend שלח את קוד סטטוס התגובה405ללא הכותרתAllow.כותרות תגובה ערך X-Apigee-fault-code protocol.http.Response405WithoutAllowHeaderX-Apigee-fault-source target
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבל את פרטי המפתח לגבי שגיאות HTTP
502. בודקים את יומני הגישה של NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
הערה: מחליפים את ORG, ORG ו-PORT# בערכים בפועל.
- מחפשים אם יש שגיאות
502עם קוד השגיאהprotocol.http.Response405WithoutAllowHeaderבמהלך פרק זמן מסוים (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם קוד השגיאה502. אם מצאתם שגיאות
502עם X-Apigee-fault-code שתואם לערך שלprotocol.http.Response405WithoutAllowHeader, צריך לקבוע את הערך של X-Apigee-fault-source.דוגמה לשגיאה 502 מיומן הגישה של NGINX:
בדוגמה שלמעלה מיומן הגישה של NGINX, הערכים של X-Apigee- fault-code ושל X-Apigee-fault-source: הם:
כותרות תגובה ערך X-Apigee-fault-code protocol.http.Response405WithoutAllowHeaderX-Apigee-fault-source target
הגורם: תגובה 405 ללא כותרת Allow מהשרת העורפי
אבחון
- קובעים את קוד השגיאה ואת מקור השגיאה של
502 Bad Gatewayבאמצעות API Monitoring, Trace Tool או יומני גישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון. - אם קוד השגיאה הוא
protocol.http.Response405WithoutAllowHeaderולמקור השגיאה יש את הערךtarget, המשמעות היא שהשרת העורפי הגיב עם קוד סטטוס405ללא הכותרתAllow. לכן, Apigee מגיב עם502 Bad Gatewayוקוד השגיאהprotocol.http.Response405WithoutAllowHeader.
רזולוציה
כדי לפתור את הבעיה, אפשר להשתמש באחת מהשיטות הבאות:
שרת עורפי
אפשרות 1: מתקנים את שרת הקצה העורפי כך שישלח את קוד המצב 405 עם כותרת Allow:
צריך לוודא ששרת הקצה העורפי תמיד פועל בהתאם למפרט RFC 7231, section 6.5.5: 405 Method Not Allowed ושולח עם קוד הסטטוס
405על ידי הכללת רשימת השיטות שמותרות כחלק מכותרתAllow, כמו שמוצג בהמשך:Allow: HTTP_METHODS
- לדוגמה, אם שרת הקצה העורפי מאפשר שימוש בשיטות
GET,POSTו-HEAD, צריך לוודא שהכותרתAllowמכילה אותן באופן הבא:Allow: GET, POST, HEAD
טיפול בשגיאות
אפשרות 2: שימוש בטיפול בשגיאות כדי לשלוח קוד סטטוס 405 עם כותרת Allow משרת ה-proxy של ה-API:
אם שרת הקצה העורפי מחזיר את קוד הסטטוס 405 ללא הכותרת Allow, אפשר להשתמש בטיפול בשגיאות כדי להחזיר את קוד הסטטוס 405 ואת הכותרת Allow מ-proxy ל-API באופן הבא:
יוצרים מדיניות כמו AssignMessage policy או RaiseFault policy ומגדירים את קוד הסטטוס ל-
405עם כותרתAllowוהודעה מותאמת אישית.מדיניות לדוגמה של AssignMessage לשליחת 405 עם כותרת Allow:
<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-405WithAllowHeader"> <DisplayName>AM-405WithAllowHeader</DisplayName> <Set> <Payload contentType="application/json">{"Specified method is not allowed. Please use one of the methods mentioned in the Allow header."}</Payload> <StatusCode>405</StatusCode> <ReasonPhrase>Method Not Allowed</ReasonPhrase> </Set> <Add> <Headers> <Header name="Allow">GET, POST, HEAD</Header> </Headers> </Add> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
יוצרים
FaultRuleב-TargetEndpointשמפעיל את המדיניות כשמתקבלת השגיאה502עם קוד השגיאהprotocol.http.Response405WithoutAllowHeader.תצורה לדוגמה של TargetEndpoint עם FaultRule:
<TargetEndpoint name="default"> ... <FaultRules> <FaultRule name="405WithoutAllowHeader"> <Step> <Name>AM-405WithAllowHeader</Name> </Step> <Condition>(fault.name = "Response405WithoutAllowHeader")</Condition> </FaultRule> </FaultRules>- שומרים את השינויים האלה בגרסה חדשה של ה-proxy ל-API ופורסים את הגרסה.
- מבצעים את הקריאות ל-API ומוודאים שמקבלים את קוד הסטטוס
405עם הכותרתAllow.
הגדרת נכס
אפשרות 3: הגדרת המאפיין במעבד ההודעות כדי למנוע מ-Apigee Edge להחזיר שגיאת 502
- אם אתם משתמשים ב-Private Cloud, אתם יכולים לעדכן את המאפיין
HTTP.ignore.allow_header.for.405ל-trueכדי למנוע מ-Apigee Edge להציג שגיאת502, גם אם שרת הקצה העורפי מגיב עם קוד סטטוס405בלי הכותרתAllow. לשם כך, אפשר להיעזר במדריך הגדרת התעלמות מהכותרת allow עבור מאפיין 405 במעבדי הודעות. - אם אתם משתמשים בענן ציבורי, אתם יכולים לפנות אל התמיכה של Apigee Edge.
מפרט
Apigee מצפה לתגובה 405 Method Not Allowed מהשרת העורפי יחד עם הכותרת Allow בהתאם למפרטים הבאים:
| מפרט | |
|---|---|
| RFC 7231, section 6.5.5: 405 Method Not Allowed | |
| RFC 7231, section 7.4.1: Allow |
נקודות חשובות שכדאי לזכור
הפתרון המומלץ הוא לתקן את שרת הבק-אנד כך שישלח את קוד הסטטוס 405 עם הכותרת Allow, ושיפעל בהתאם למפרט
RFC 7231, סעיף 6.5.5: 405 Method Not Allowed.
אם עדיין דרושה לך עזרה מצוות התמיכה של Apigee, אפשר לעבור אל איסוף מידע לצורך אבחון.
צריך לאסוף פרטי אבחון
אם הבעיה נמשכת גם אחרי שמבצעים את ההוראות שלמעלה, צריך לאסוף את פרטי האבחון הבאים ואז לפנות לתמיכה של Apigee Edge.
אם אתם משתמשי ענן ציבורי, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם ה-proxy ל-API
- הפקודה
curlשבה השתמשת כדי לשחזר את502 Bad Gatewayעם קוד השגיאהprotocol.http.Response405WithoutAllowHeader - קובץ מעקב לבקשות ה-API
אם אתם משתמשים ב-Private Cloud, עליכם לספק את הפרטים הבאים:
- הודעת השגיאה המלאה שזוהתה בבקשות שנכשלו
- שם הסביבה
- חבילת proxy ל-API
- קובץ מעקב לבקשות ה-API
יומני גישה של NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log
הערה: מחליפים את ORG, ORG ו-PORT# בערכים בפועל.
- יומני מערכת של מעבד ההודעות
/opt/apigee/var/log/edge-message-processor/logs/system.log