503 השירות לא זמין - יצירת מנהרה של שרת proxy נכשלה עם 403

אתם צופים במסמכי התיעוד של 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

403 - Forbidden

יכול להיות שהסיבה לכך היא הגבלות של חומת אש או של רשימת ACL שהוגדרו בשרת העורפי ומונעות יצירה של מנהרה.

ה-Proxy סירב ליצור מנהרה עם סטטוס תגובה 503

503 - Service Unavailable

זה יכול לקרות בגלל בעיות ב-DNS, הגבלות של חומת אש, חוסר זמינות של שרת בק-אנד שמונע יצירה של מנהרה

ה-Proxy סירב ליצור מנהרה עם סטטוס תגובה 504

504 - Gateway Timeout

זה יכול לקרות אם יש פסק זמן במהלך יצירת המנהרה

בהתאם לקוד הסטטוס שמופיע ב-faultstring, צריך להשתמש בטכניקות המתאימות כדי לפתור את הבעיה. במדריך הזה מוסבר איך לפתור את הבעיה אם מופיע קוד הסטטוס 403 בfaultstring עבור קוד השגיאה protocol.http.ProxyTunnelCreationFailed.

גורמים אפשריים

השגיאה הזו (קוד סטטוס 403) מתרחשת אם יש הגבלות של חומת אש או של רשימת בקרת גישה (ACL) שהוגדרו בשרת העורפי ומונעות משרת ה-proxy ליצור את המנהרה בין Apigee Edge לבין השרת העורפי.

סיבה תיאור הוראות לפתרון בעיות שרלוונטיות ל
שרת ה-Proxy סירב ליצור מנהרה עם סטטוס תגובה 403 שרת ה-proxy מסרב ליצור את המנהרה כי הוא מקבל את שם המארח של שרת ה-proxy במקום את שם המארח של שרת ה-Backend בכותרת Host. משתמשי Edge Private Cloud בלבד

שלבים נפוצים לאבחון

כדי לאבחן את השגיאה הזו, אפשר להשתמש באחד מהכלים או מהטכניקות הבאים:

כלי המעקב

כדי לאבחן את השגיאה באמצעות הכלי Trace:

  1. מפעילים את trace session ואחת מהאפשרויות הבאות:
    • מחכים שהשגיאה תתרחש, או
    • אם אפשר לשחזר את הבעיה, מבצעים את הקריאה ל-API כדי לשחזר את הבעיה 503 Service Unavailable עם Proxy refused to create tunnel with response status 403.
  2. מוודאים שהאפשרות הצגת כל פרטי הזרימה מופעלת:

  3. בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
  4. אפשר לנווט בין השלבים השונים של ה-trace ולמצוא את המקום שבו התרחשה השגיאה.
  5. השגיאה בדרך כלל מופיעה אחרי השלב Target Request Flow Started כמו שמוצג בהמשך:

    חשוב לזכור:

    שגיאה: Proxy refused to create tunnel with response status 403

  6. עוברים לשלב AX (נתוני Analytics שתועדו) בנתוני המעקב ולוחצים עליו.
  7. גוללים למטה לקטע פרטי שלב כותרות תגובה וקובעים את הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source כמו שמוצג בהמשך:

    ( הגדלת התמונה)

    ( הגדלת התמונה)

  8. הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source יהיו protocol.http.ProxyTunnelCreationFailed ו-target בהתאמה, מה שמצביע על כך שהשגיאה הזו נגרמת בגלל שיצירת מנהרת ה-proxy נכשלה כי כותרת המארח הצפויה לא התקבלה.

    כותרות תגובה ערך
    X-Apigee-fault-code protocol.http.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

NGINX

כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:

  1. אם אתם משתמשים ב-Private Cloud, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לקבוע את פרטי המפתח לגבי שגיאות HTTP 503 Service Unavailable.
  2. בודקים את יומני הגישה של NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ORG.PORT#_access_log

    איפה: הערכים ORG,‏ ORG ו-PORT# מוחלפים בערכים בפועל.

  3. מחפשים שגיאות עם קוד השגיאה 503protocol.http.ProxyTunnelCreationFailed במהלך פרק זמן ספציפי (אם הבעיה התרחשה בעבר) או אם יש בקשות שעדיין נכשלות עם קוד השגיאה 503.
  4. אם מופיעות שגיאות 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.ProxyTunnelCreationFailed
    X-Apigee-fault-source target

הסיבה: ה-Proxy סירב ליצור מנהרה עם סטטוס תגובה 403

אבחון

  1. קובעים את קוד התקלה ואת מקור התקלה עבור 503 Service Unavailable באמצעות כלי המעקב או יומני הגישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון.
  2. בודקים את הודעת השגיאה ומזהים את קוד הסטטוס שמופיע ב-faultstring לציון כשל ביצירת המנהרה.
  3. במקרה כזה, קוד הסטטוס הוא 403, כלומר Forbidden (אסור).
  4. המשמעות היא שאין לכם מספיק זכויות או הרשאות כדי ליצור את המנהרה. בדרך כלל זה קורה אם יש הגבלות בחומת האש או ברשימה של בקרת גישה (ACL) שמונעות את יצירת המנהרה.
  5. בודקים אם יש הגבלות של חומת אש או של רשימת ACL שהוגדרו בשרת העורפי שיכולות למנוע את יצירת המנהרה.
  6. בהתאם לסוג חומת האש ו/או ההגבלות של ACL, צריך לפתור את הבעיה בצורה המתאימה.
  7. כדי להסביר איך לפתור את הבעיה הזו, נשתמש בדוגמה של הגבלה בחומת אש:

    תרחיש: חומת אש עם הגבלה בשרת העורפי מצפה שכותרת המארח תמיד תכיל את שם המארח של השרת העורפי

    אפשר להשתמש באחת מהדרכים הבאות כדי לקבוע את כותרת המארח שמועברת על ידי Apigee Edge:

    מעקב

    כדי לקבוע את כותרת המארח באמצעות Trace:

    1. מוודאים שהרכיב faultstring מכיל את הרכיב Proxy refused to create tunnel with response status 403 באמצעות מעקב, כפי שמוסבר במאמר בנושא שלבים נפוצים לאבחון.
    2. עוברים לשלב Target Request Flow Started ובודקים את Request Headers.
    3. בודקים את הערך של שם המארח שצוין בכותרת המארח בקטע כותרות הבקשה.
    4. אם הכותרת Host מכילה את שם המארח של ה-Proxy, זו הסיבה לשגיאה הזו.
    5. הסיבה לכך היא שחומת האש מוגדרת בשרת העורפי לקבל את הבקשות רק אם כותרת המארח מכילה את השם של השרת העורפי.
    6. לכן, כששרת ה-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

    1. מריצים את הפקודה הבאה כדי ללכוד tcpdump בשרת ה-proxy את הבקשות שמגיעות מרכיב מעבד ההודעות של Apigee Edge:

      tcpdump -i any -s 0 host MP_IP_ADDRESS -w FILE_NAME
      

      מידע נוסף על השימוש בפקודה tcpdump זמין במאמר tcpdump.

    2. מנתחים את הנתונים של tcpdump באמצעות הכלי Wireshark או כלי דומה.
    3. לפניכם דוגמה לניתוח של tcpdump באמצעות Wireshark:

      ( הגדלת התמונה)

    4. מספרי המנות 13,‏ 14 ו-15 מראים שמעבד ההודעות יוצר חיבור לשרת ה-proxy באמצעות תהליך לחיצת יד תלת-כיוונית של TCP.
    5. במנה 16, מעבד ההודעות התחבר למארח הפרוקסי httpbin.org (כפי שמוצג בדוגמה שלמעלה).
    6. בוחרים בחבילה 16 ובודקים את התוכן שלה בפירוט, ובמיוחד את כותרת המארח שמועברת לשרת הפרוקסי על ידי מעבד ההודעות.

    7. בדוגמה שלמעלה מוצגת כותרת המארח httpin.org, שהיא שם המארח של שרת ה-proxy. לכן, כששרת ה-proxy מנסה ליצור את המנהרה עם שרת הקצה העורפי על ידי העברת כותרת המארח httpin.org שלמעלה, הוא נכשל עם השגיאה Proxy refused to create tunnel with response status 403.

רזולוציה

תרחיש: חומת אש עם הגבלה על שרת proxy מצפה שכותרת המארח תמיד תכיל את שם המארח של שרת הקצה העורפי

אם הגעתם למסקנה שהשגיאה הזו נגרמת בגלל שחומת האש בשרת העורפי מוגדרת כך שהיא מצפה שכותרת המארח תמיד תכיל את שם המארח של השרת העורפי, בזמן שמעבד ההודעות שולח את שם המארח של שרת ה-proxy, צריך לבצע את השלבים הבאים כדי לפתור את הבעיה:

  1. מגדירים את המאפיין 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>
  2. מוודאים שהמאפיינים האחרים שקשורים ל שרת Proxy קדמי מוגדרים במעבד ההודעות באופן הבא:

    1. בודקים את הקובץ /opt/apigee/customer/application/message-processor.properties בכל אחד ממעבדי ההודעות.
    2. מוודאים שהמאפיינים הבאים מוגדרים בהתאם לתרחיש השימוש או לדרישות:

      ערכים לדוגמה של מאפיינים:

      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

קובצי עזר