404 מארחים וירטואליים מרובים עם אותו כינוי מארח

כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של Apigee X.
מידע

תיאור הבעיה

אפליקציית הלקוח מקבלת קוד סטטוס HTTP של 404 עם ההודעה Not Found והודעת השגיאה Unable to identify proxy for host: VIRTUAL_HOST and url: PATH כתגובה לקריאות ל-API.

המשמעות של השגיאה הזו היא ש-Edge לא מצא את שרת ה-proxy של ה-API למארח הווירטואלי ולנתיב שצוינו.

הודעת השגיאה

אפליקציית הלקוח מקבלת את קוד התגובה הבא:

HTTP/1.1 404 Not Found

בנוסף, ייתכן שתופיע הודעת שגיאה שדומה לזו:

{
   "fault":{
      "faultstring":"Unable to identify proxy for host: default and url: \/oauth2\/token",
      "detail":{
         "errorcode":"messaging.adaptors.http.flow.ApplicationNotFound"
      }
   }
}

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

סיבה התיאור ההוראות לפתרון בעיות הרלוונטיות עבור
מארח וירטואלי עם כינוי מארח כפול לכמה מארחים וירטואליים יש אותו שם מארח ואותו מספר יציאה. משתמשי Edge הציבוריים והפרטיים

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

היומנים של NGINX ומעבד ההודעות יעזרו לפתור את השגיאה 404. כדי לבדוק את היומנים:

  1. מציגים את יומני NGINX באמצעות הפקודה הבאה:
    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
  2. בודקים אם השדות הבאים מופיעים ברשומות ביומן:
    שדה Value
    Upstream_status, status 404
    X-Apigee-fault-code messaging.adaptors.http.flow.ApplicationNotFound

    מומלץ לרשום לפניכם את מזהה ההודעה ביומנים.

  3. כדאי לבדוק את היומנים של מעבד ההודעות (/opt/apigee/var/log/edge-message-processor/logs/system.log) כדי לראות אם יש לך messaging.adaptors.http.flow.ApplicationNotFound עבור ה-API הספציפי, או אם יש לך את מזהה ההודעה הייחודי משלב 2 של בקשת ה-API.

    הודעת שגיאה לדוגמה מהיומן של מעבד ההודעות

  4. NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST,
    uri:/weather, message Id:null, exception:com.apigee.rest.framework.ResourceNotFoundException{
    code = messaging.adaptors.http.flow.ApplicationNotFound, message = Unable to identify proxy for
    host: vh1 and url: /weather, associated contexts = []}, context:Context@342ea86b
    input=ClientInputChannel(SSLClientChannel[Accepted: Remote:10.123.123.123:8443
    Local:10.135.33.68:62092]@1206954 useCount=1 bytesRead=0 bytesWritten=0 age=1ms
    lastIO=0ms  isOpen=true)
    

    היומן שלמעלה מציג את קוד השגיאה והודעת השגיאה הבאה:

    code = messaging.adaptors.http.flow.ApplicationNotFound,
    message = Unable to identify proxy for host: vh1 and url: /weather
    

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

נתבי Apigee Edge ומעבדי הודעות משתמשים בכותרת המארח, במספר היציאה ובנתיבי ה-URI כדי לנתב תעבורת נתונים לשרת ה-API הנכון. הגדרות לא חד-משמעיות, כמו מספר מארחים וירטואליים עם אותו כינוי מארח ומספר יציאה, הן מניעת דפוס מתועדת ויכולה להוביל להתנהגות בלתי צפויה. אחת מהשגיאות הנפוצות שיופיעו היא שגיאה מסוג 404 בהודעה Unable to identify proxy for host: VIRTUAL_HOST and url: PATH.

בדרך כלל אם קיימים כמה מארחים וירטואליים עם אותו כינוי מארח, יוצגו לך שגיאות 404 לסירוגין. הסיבה לכך היא שיכול להיות ששרת ה-Proxy הספציפי ל-API מוגדר לקבל את הבקשות רק באחד מהמארחים הווירטואליים. כשבקשות ה-API מנותבות למארח הווירטואלי הספציפי שמוגדר ב-API Proxy, התגובה מתקבלת. עם זאת, כשבקשות ה-API מנותבות למארחים הווירטואליים האחרים שאליהם שרת ה-Proxy של ה-API לא מוגדר לקבל את הבקשות, ממשקי ה-API ייכשלו ותוצג שגיאת 404 הזו.

צריך לפעול לפי ההוראות ב 404 לא לזהות שרת proxy למארח: <virtual host name> ו-url: <path>, ולפתור את השגיאה. אם אף אחד מהגורמים לשגיאה הזו לא גורם לשגיאה הזו, מבצעים את השלבים שלמטה כדי לבדוק אם מארחים וירטואליים עם כינויי מארח כפולים גורמים לשגיאות 404.

אבחון

אפשר להשתמש באחת מהשיטות הבאות כדי לבדוק אם יש כמה מארחים וירטואליים שיש להם אותו שם מארח/יציאה אחת, שמובילים לשגיאות 404:

  • ממשק המשתמש של Edge
  • ממשקי API לניהול

ממשק המשתמש של Edge

אפשר להיעזר בהוראות הבאות כדי לבדוק אם יש כמה מארחים וירטואליים שיש להם אותו כינוי/יציאה מארח, באמצעות ממשק המשתמש של Edge.

לדוגמה, אם הבחנתם בשגיאה 404 בכתובת ה-URL http://example.com:9001/proxy1, עליכם לבדוק לאילו מארחים וירטואליים יש את כינוי המארח example.com ואת היציאה 9001.

  1. בענן ציבורי ובממשק המשתמש החדש של Edge בענן פרטי:
    1. בחר במנהל מערכת.
    2. בוחרים באפשרות מארחים וירטואליים.
    3. לכל סביבה, משתמשים במסנן החיפוש כדי לקבוע את המארחים הווירטואליים שתואמים לכינוי המארח הספציפי שבאמצעותו הופעלו בקשות ה-API.
    4. אם מצאתם כמה מארחים וירטואליים שמשתמשים באותו כתובת אימייל חלופית של מארח, עוברים אל פתרון כדי לפתור את הבעיה.

    למשל:

  2. בממשק המשתמש הקלאסי בענן פרטי:
    1. לוחצים על הכרטיסייה APIs .
    2. בוחרים באפשרות Environment Configuration (הגדרת סביבה).
    3. בוחרים באפשרות מארחים וירטואליים.
    4. עבור כל סביבה, מציגים את רשימת מארחים וירטואליים כדי לראות אם יש התאמה לכינוי המארח הספציפי שבאמצעותו הופעלו בקשות ה-API.
    5. אם מוצאים כמה מארחים וירטואליים שתואמים לאותו כתובת אימייל חלופית של מארח, עוברים אל פתרון כדי לפתור את הבעיה.

    דוגמה:

ממשקי API לניהול

תוכלו להיעזר בהוראות הבאות כדי לבדוק אם יש כמה מארחים וירטואליים שיש להם את אותו כינוי/יציאה של מארח, באמצעות ממשקי ה-API לניהול.

  1. צריך להבין את ההגדרה של כל אחד מהמארחים הווירטואליים בכל אחת מהסביבות בארגון שלך כדי לראות לאילו מארחים וירטואליים יש אותו כינוי מארח ואותו מספר יציאה:

    לדוגמה, אם גיליתם את השגיאה 404 בכתובת ה-URL http://example.com:9001/proxy1, אתם צריכים לבדוק לאילו מארחים וירטואליים יש את כינוי המארח example.com ואת היציאה 9001.

    1. קבלת רשימת הסביבות

      משתמשים בענן הציבורי:

      curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments -u USERNAME
      

      משתמש בענן פרטי:

      curl -v -X GET http://MANAGEMENT_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments -u USERNAME
      

      כאשר:

      ORGANIZATION_NAME הוא שם הארגון

      דוגמה:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments -u USERNAME
      
      [ "prod", "test", "dev" ]
      
    2. הצגת רשימת המארחים הווירטואליים בסביבה

      משתמשים בענן הציבורי:

      curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts -u USERNAME
      

      משתמש בענן פרטי:

      curl -v -X GET http://MANAGEMENT_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts -u USERNAME
      

      כאשר:

      ORGANIZATION_NAME הוא שם הארגון

      ENVIRONMENT_NAME זהו שם הסביבה

      דוגמה:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts -u USERNAME
      
      [ "default" ]
      
    3. מציגים את ההגדרה של כל אחד מהמארחים הווירטואליים שבסביבה.

      משתמשים בענן הציבורי:

      curl -v -X GET https//api.enterprise.apigee.com/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUAL_HOST_NAME  -u USERNAME
      

      משתמש בענן פרטי:

      curl -v -X GET http://MANAGEMENT_HOST:PORT#/v1/organizations/ORGANIZATION_NAME/environments/ENVIRONMENT_NAME/virtualhosts/VIRTUAL_HOST_NAME -u USERNAME
      

      כאשר:

      ORGANIZATION_NAME הוא שם הארגון

      ENVIRONMENT_NAME זהו שם הסביבה

      VIRTUAL_HOST_NAME הוא שם המארח הווירטואלי

      דוגמה:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/test/virtualhosts/default -u USERNAME
      
      {
        "hostAliases" : [ "example.com" ],
        "interfaces" : [ ],
        "listenOptions" : [ ],
        "name" : "default",
        "port" : "9001",
        "retryOptions" : [ ]
      }
      
    4. חוזרים על שני השלבים האלה בסביבות האחרות בארגון.

      בדוגמה הזו, יש לחזור על השלבים עבור הסביבה dev:

      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/dev/virtualhosts -u USERNAME
      
      [ "default" ]
      
      curl http://127.0.0.1:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u USERNAME
      
      {
        "hostAliases" : [ "example.com" ],
        "interfaces" : [ ],
        "listenOptions" : [ ],
        "name" : "default",
        "port" : "9001",
        "retryOptions" : [ ]
      }
      

      בדוגמה הזו אפשר לראות ששני המארחים הווירטואליים default בשתי סביבות שונות, test ו-dev, מכילים את אותו כינוי מארח example.com ואותו מספר יציאה 9001. זו הסיבה לשגיאות מסוג 404.

    5. אם מוצאים כמה מארחים וירטואליים שתואמים לאותו כתובת אימייל חלופית של מארח, עוברים אל פתרון כדי לפתור את הבעיה.

רזולוציה

  1. מוודאים שכל מארח וירטואלי מכיל רק שילובים ייחודיים של כינוי מארח ויציאות.
  2. אם זיהיתם כמה מארחים וירטואליים עם אותם שילובים של מארח ויציאות, עליכם לעדכן אותם באמצעות כינוי מארח ייחודי.
  3. אפשר לעדכן את ההגדרות האלה דרך ממשק המשתמש של Edge או ה-Management API. ההוראות מפורטות בקטע שינוי מארח וירטואלי.
  4. מוודאים שלכל כינוי מארח יש רשומת DNS מתאימה.
  5. בדוגמה שלמעלה, אם ההגדרה שלנו נראית כך:
    curl -X GET http://localhost:8080/v1/organizations/myorg/environments -u user
    
    [ "prod", "test", "dev" ]
    
    curl -X GET http://localhost:8080/v1/organizations/myorg/environments/test/virtualhosts/default -u user
    
    {
      "hostAliases" : [ "example.com" ],
      "interfaces" : [  ],
      "listenOptions" : [  ],
      "name" : "default",
      "port" : "9001",
      "retryOptions" : [  ]
    }
    
    curl -X GET http://localhost:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u user
    
    {
      "hostAliases" : [ "example.com" ],
      "interfaces" : [  ],
      "listenOptions" : [  ],
      "name" : "default",
      "port" : "9001",
      "retryOptions" : [  ]
    }
    
    1. ניתן לעדכן את המארח הווירטואלי השגוי כך שלא יחפוף.
    2. כלומר, עדכון הכינוי הוא example2.com.
    3. מוודאים שלכינוי המארח החדש יש רשומת DNS שדומה לזו של כינוי המארח הקודם.
      curl -X GET http://localhost:8080/v1/organizations/myorg/environments/dev/virtualhosts/default -u user -H 'Content-Type: application/json' -d '{
        "hostAliases" : [ "example2.com" ],
        "interfaces" : [  ],
        "listenOptions" : [  ],
        "name" : "default",
        "port" : "9001",
        "retryOptions" : [  ]
      }' -i
      
      HTTP/1.1 200 OK
      Date: Tue, 02 Feb 2021 20:54:29 GMT
      Content-Type: application/json
      X-Apigee.user: user
      X-Apigee.organization: myorg
      X-Apigee.environment: dev
      X-Apigee.backends: management-server
      Date: Tue, 02 Feb 2021 20:54:29 GMT
      Content-Length: 152
      
      {
        "hostAliases" : [ "example2.com" ],
        "interfaces" : [  ],
        "listenOptions" : [  ],
        "name" : "default",
        "port" : "9001",
        "retryOptions" : [  ]
      }
      
  6. מבצעים שוב את הקריאות ל-API לשרת ה-proxy ומוודאים שהתשובות מתקבלות באופן עקבי:
    curl http://example.com:9001/proxy1
    
    {
        "slideshow": {
    	    "author": "Yours Truly",
    		"date": "date of publication",
    		"slides": [
    		    {
    			    "title": "Wake up to WonderWidgets!",
    				"type:": "all"
    			},
    			{
    			    "items": [
    				    "Why WonderWidgets are great",
    					"Who buys WonderWidgets"
    				],
    				"title": "Overview",
    				"type": "all"
    			}
    		],
    		"title": "Sample Slide Show"
        }
    
    }
    
  7. אם הבעיה נמשכת, עוברים אל חובה לאסוף פרטי אבחון.

צריך לאסוף פרטי אבחון

אם הבעיה נמשכת גם אחרי שביצעתם את ההוראות שלמעלה, עליכם לאסוף את פרטי האבחון הבאים ולאחר מכן לפנות לתמיכה של Apigee Edge:

אם אתם משתמשים ב-Public Cloud, עליכם לספק את הפרטים הבאים:

  • שם הארגון
  • שם הסביבה
  • שם שרת proxy ל-API
  • צריך להשלים את הפקודה curl כדי לשחזר את השגיאה 404
  • אם השגיאות 404 לא מתרחשות כרגע, יש לציין את תקופת הזמן עם פרטי אזור הזמן שבהם התרחשו שגיאות מסוג 404 בעבר.

אם אתם משתמשים בענן פרטי, עליכם לספק את הפרטים הבאים:

  • זוהתה הודעת שגיאה מלאה בבקשות שנכשלו
  • הארגון, שם הסביבה ושם ה-Proxy של ה-API שלגביהם מופיעות שגיאות מסוג 404
  • חבילת שרת proxy ל-API
  • יומני הגישה של NGINX
    /opt/apigee/var/log/edge-router/nginx/ORGANIZATION_NAME~ENVIRONMENT_NAME.PORT#_access_log
  • יומנים של מעבד ההודעות
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • תקופת הזמן עם פרטי אזור הזמן שבה אירעו השגיאות מסוג 404