אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X. מידע
תיאור הבעיה
אפליקציית הלקוח מקבלת קוד סטטוס של HTTP 503 Service Unavailable עם קוד השגיאה protocol.http.ProxyTunnelCreationFailed כתגובה לקריאות ל-API.
הודעת שגיאה
אפליקציית הלקוח מקבלת את קוד התגובה הבא:
HTTP/1.1 503 Service Unavailable
בנוסף, יכול להיות שתופיע הודעת השגיאה הבאה:
{
"fault":{
"faultstring":"Proxy refused to create tunnel with response status 403",
"detail":{
"errorcode":"protocol.http.ProxyTunnelCreationFailed"
}
}
}פרוקסי קדימה ומנהור
ב-Apigee Edge, שרתי proxy ל-API יכולים לתקשר עם השרת בקצה העורפי דרך שרת proxy, כמו שמוסבר במאמר
הגדרת שרת proxy קדימה. שרת ה-proxy פותח חיבור מאובטח (HTTPS) או לא מאובטח (HTTP) לשרת הקצה העורפי, בהתאם לסוג ה-proxy (שמצוין על ידי המאפיין HTTPClient.proxy.type) שבו נעשה שימוש, ומעביר את הנתונים בשני הכיוונים. הפעולה הזו נקראת מנהור.
כברירת מחדל, Apigee Edge משתמש במנהור לכל התנועה. כדי להשבית את המנהור, צריך להגדיר את המאפיין HTTPClient.use.tunneling כ-false.
קוד שגיאה: protocol.http.ProxyTunnelCreationFailed
Apigee Edge מחזיר את קוד השגיאה protocol.http.ProxyTunnelCreationFailed אם שרת ה-Proxy לא מצליח ליצור מנהרה בין Apigee Edge לבין שרת הקצה העורפי בגלל בעיות כמו חומת אש, הגבלות של רשימה של בקרת גישה (ACL), בעיות ב-DNS, חוסר זמינות של שרת הקצה העורפי, פסק זמן וכו'.
קוד הסטטוס ב-faultstring של התשובה מ-Apigee Edge מציין בדרך כלל סיבה אפשרית ברמה גבוהה שהובילה לשגיאה הזו.
תבנית של מחרוזת שגיאה:
Proxy refused to create tunnel with response status STATUS_CODE
סיבות אפשריות לחלק מקודי הסטטוס שנצפו ב-faultstring:
בטבלה הבאה מתוארות סיבות אפשריות בהתאם לקוד הסטטוס שמצוין ב-faultstring:
| Faultstring | תיאור |
|---|---|
ה-Proxy סירב ליצור מנהרה עם סטטוס תגובה 403 |
יכול להיות שהסיבה לכך היא הגבלות של חומת אש או של רשימת ACL שהוגדרו בשרת העורפי ומונעות יצירה של מנהרה. |
ה-Proxy סירב ליצור מנהרה עם סטטוס תגובה 503 |
זה יכול לקרות בגלל בעיות ב-DNS, הגבלות של חומת אש, חוסר זמינות של שרת בק-אנד שמונע יצירה של מנהרה |
| ה-Proxy סירב ליצור מנהרה עם סטטוס תגובה 504 |
זה יכול לקרות אם יש פסק זמן במהלך יצירת המנהרה |
בהתאם לקוד הסטטוס שמופיע ב-faultstring, צריך להשתמש בטכניקות המתאימות כדי לפתור את הבעיה. במדריך הזה מוסבר איך לפתור את הבעיה אם מופיע קוד הסטטוס 403 בfaultstring עבור קוד השגיאה protocol.http.ProxyTunnelCreationFailed.
גורמים אפשריים
השגיאה הזו (קוד סטטוס 403) מתרחשת אם יש הגבלות של חומת אש או של רשימת בקרת גישה (ACL) שהוגדרו בשרת העורפי ומונעות משרת ה-proxy ליצור את המנהרה בין Apigee Edge לבין השרת העורפי.
| סיבה | תיאור | הוראות לפתרון בעיות שרלוונטיות ל |
|---|---|---|
| שרת ה-Proxy סירב ליצור מנהרה עם סטטוס תגובה 403 | שרת ה-proxy מסרב ליצור את המנהרה כי הוא מקבל את שם המארח של שרת ה-proxy במקום את שם המארח של שרת ה-Backend בכותרת Host. |
משתמשי Edge Private Cloud בלבד |
שלבים נפוצים לאבחון
כדי לאבחן את השגיאה הזו, אפשר להשתמש באחד מהכלים או מהטכניקות הבאים:
כלי המעקב
כדי לאבחן את השגיאה באמצעות הכלי Trace:
- מפעילים את trace session ואחת מהאפשרויות הבאות:
- מחכים שהשגיאה תתרחש, או
- אם אפשר לשחזר את הבעיה, מבצעים את הקריאה ל-API כדי לשחזר את הבעיה
503 Service UnavailableעםProxy refused to create tunnel with response status 403.
מוודאים שהאפשרות הצגת כל פרטי הזרימה מופעלת:
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- אפשר לנווט בין השלבים השונים של ה-trace ולמצוא את המקום שבו התרחשה השגיאה.
השגיאה בדרך כלל מופיעה אחרי השלב Target Request Flow Started כמו שמוצג בהמשך:
חשוב לזכור:
שגיאה:
Proxy refused to create tunnel with response status 403- עוברים לשלב AX (נתוני Analytics שתועדו) בנתוני המעקב ולוחצים עליו.
גוללים למטה לקטע פרטי שלב כותרות תגובה וקובעים את הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source כמו שמוצג בהמשך:
( הגדלת התמונה)
( הגדלת התמונה)
הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source יהיו
protocol.http.ProxyTunnelCreationFailedו-targetבהתאמה, מה שמצביע על כך שהשגיאה הזו נגרמת בגלל שיצירת מנהרת ה-proxy נכשלה כי כותרת המארח הצפויה לא התקבלה.כותרות תגובה ערך X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailedX-Apigee-fault-source target
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי שגיאות HTTP
503 Service Unavailable. בודקים את יומני הגישה של NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_logאיפה: הערכים ORG, ORG ו-PORT# מוחלפים בערכים בפועל.
- מחפשים שגיאות עם קוד השגיאה
503protocol.http.ProxyTunnelCreationFailedבמהלך פרק זמן ספציפי (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם קוד השגיאה503. אם מופיעות שגיאות
503עם הערך של X-Apigee-fault-code שזהה לערך שלprotocol.http.ProxyTunnelCreationFailed, צריך לקבוע את הערך של X-Apigee-fault-source.דוגמה לשגיאה 503 מיומן הגישה של NGINX:
בדוגמה שלמעלה מיומן הגישה של NGINX, הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source הם:
כותרות תגובה ערך X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailedX-Apigee-fault-source target
הסיבה: ה-Proxy סירב ליצור מנהרה עם סטטוס תגובה 403
אבחון
- קובעים את קוד התקלה ואת מקור התקלה עבור
503 Service Unavailableבאמצעות כלי המעקב או יומני הגישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון. - בודקים את הודעת השגיאה ומזהים את קוד הסטטוס
שמופיע ב-
faultstringלציון כשל ביצירת המנהרה. - במקרה כזה, קוד הסטטוס הוא
403, כלומר Forbidden (אסור). - המשמעות היא שאין לכם מספיק זכויות או הרשאות כדי ליצור את המנהרה. בדרך כלל זה קורה אם יש הגבלות בחומת האש או ברשימה של בקרת גישה (ACL) שמונעות את יצירת המנהרה.
- בודקים אם יש הגבלות של חומת אש או של רשימת ACL שהוגדרו בשרת העורפי שיכולות למנוע את יצירת המנהרה.
- בהתאם לסוג חומת האש ו/או ההגבלות של ACL, צריך לפתור את הבעיה בצורה המתאימה.
כדי להסביר איך לפתור את הבעיה הזו, נשתמש בדוגמה של הגבלה בחומת אש:
תרחיש: חומת אש עם הגבלה בשרת העורפי מצפה שכותרת המארח תמיד תכיל את שם המארח של השרת העורפי
אפשר להשתמש באחת מהדרכים הבאות כדי לקבוע את כותרת המארח שמועברת על ידי Apigee Edge:
מעקב
כדי לקבוע את כותרת המארח באמצעות Trace:
- מוודאים שהרכיב
faultstringמכיל את הרכיבProxy refused to create tunnel with response status 403באמצעות מעקב, כפי שמוסבר במאמר בנושא שלבים נפוצים לאבחון. - עוברים לשלב Target Request Flow Started ובודקים את Request Headers.
- בודקים את הערך של שם המארח שצוין בכותרת המארח בקטע כותרות הבקשה.
- אם הכותרת Host מכילה את שם המארח של ה-Proxy, זו הסיבה לשגיאה הזו.
- הסיבה לכך היא שחומת האש מוגדרת בשרת העורפי לקבל את הבקשות רק אם כותרת המארח מכילה את השם של השרת העורפי.
- לכן, כששרת ה-proxy מנסה ליצור את המנהרה עם השרת העורפי, הוא נכשל עם השגיאה
Proxy refused to create tunnel with response status 403.דוגמה למעקב שמראה שכותרת המארח כוללת את שם המארח של ה-proxy
( הגדלת התמונה)
בדוגמה שלמעלה, אפשר לראות שכותרת המארח מכילה את שם מארח ה-proxy
www.proxyserver.com.. מכיוון שחלה הגבלת חומת אש על שרת הקצה העורפי, והוא מצפה שכותרת המארח תכיל רק את שם המארח של שרת הקצה העורפי, מתקבלת השגיאהProxy refused to create tunnel with response status 403.
tcpdump
כדי לקבוע את כותרת המארח באמצעות tcpdump
מריצים את הפקודה הבאה כדי ללכוד
tcpdumpבשרת ה-proxy את הבקשות שמגיעות מרכיב מעבד ההודעות של Apigee Edge:tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
מידע נוסף על השימוש בפקודה
tcpdumpזמין במאמר tcpdump.- מנתחים את הנתונים של
tcpdumpבאמצעות הכלי Wireshark או כלי דומה. לפניכם דוגמה לניתוח של tcpdump באמצעות Wireshark:
( הגדלת התמונה)
- מספרי המנות 13, 14 ו-15 מראים שמעבד ההודעות יוצר חיבור לשרת ה-proxy באמצעות תהליך לחיצת יד תלת-כיוונית של TCP.
- במנה 16, מעבד ההודעות התחבר למארח הפרוקסי
httpbin.org(כפי שמוצג בדוגמה שלמעלה). בוחרים בחבילה 16 ובודקים את התוכן שלה בפירוט, ובמיוחד את כותרת המארח שמועברת לשרת הפרוקסי על ידי מעבד ההודעות.
- בדוגמה שלמעלה מוצגת כותרת המארח
httpin.org, שהיא שם המארח של שרת ה-proxy. לכן, כששרת ה-proxy מנסה ליצור את המנהרה עם שרת הקצה העורפי על ידי העברת כותרת המארחhttpin.orgשלמעלה, הוא נכשל עם השגיאהProxy refused to create tunnel with response status 403.
- מוודאים שהרכיב
רזולוציה
תרחיש: חומת אש עם הגבלה על שרת proxy מצפה שכותרת המארח תמיד תכיל את שם המארח של שרת הקצה העורפי
אם הגעתם למסקנה שהשגיאה הזו נגרמת בגלל שחומת האש בשרת העורפי מוגדרת כך שהיא מצפה שכותרת המארח תמיד תכיל את שם המארח של השרת העורפי, בזמן שמעבד ההודעות שולח את שם המארח של שרת ה-proxy, צריך לבצע את השלבים הבאים כדי לפתור את הבעיה:
מגדירים את המאפיין
use.proxy.host.header.with.target.uriלערך true ב-TargetEndpoint, כמו בדוגמה הבאה:דוגמה להגדרה של TargetEndpoint:
<TargetEndpoint name="default"> <HTTPTargetConnection> <URL>https://mocktarget.apigee.net/json</URL> <Properties> <Property name="use.proxy.host.header.with.target.uri">true</Property> </Properties> </HTTPTargetConnection> </TargetEndpoint>מוודאים שהמאפיינים האחרים שקשורים ל שרת Proxy קדמי מוגדרים במעבד ההודעות באופן הבא:
- בודקים את הקובץ
/opt/apigee/customer/application/message-processor.propertiesבכל אחד ממעבדי ההודעות. מוודאים שהמאפיינים הבאים מוגדרים בהתאם לתרחיש השימוש או לדרישות:
ערכים לדוגמה של מאפיינים:
conf_http_HTTPClient.use.proxy=true conf/http.properties+HTTPClient.proxy.type=HTTP conf/http.properties+HTTPClient.proxy.host=PROXY_SERVER_HOST_NAME conf/http.properties+HTTPClient.proxy.port=PORT_# conf/http.properties+HTTPClient.proxy.user=USERNAME conf/http.properties+HTTPClient.proxy.password=PASSWORD
- בודקים את הקובץ
צריך לאסוף פרטי אבחון
אם הבעיה נמשכת גם אחרי שמבצעים את ההוראות שלמעלה, צריך לאסוף את פרטי האבחון הבאים ואז לפנות לתמיכה של Apigee Edge:
אם אתם משתמשים ב-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