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 Public Cloud וב-Edge Private Cloud

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

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

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

    רושמים את מזהה ההודעה מתוך היומנים.

  3. בודקים את היומנים של Message Processor ‏(/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 כדי לנתב את תעבורת הנתונים אל proxy ל-API הנכון. הגדרות לא חד-משמעיות, כמו כמה מארחים וירטואליים עם אותו שם מארח וירטואלי ומספר יציאה, הן אנטי-תבנית מתועדת, והן עלולות לגרום להתנהגויות לא צפויות. אחת השגיאות הנפוצות שתראו היא שגיאה מספר 404 עם ההודעה Unable to identify proxy for host: VIRTUAL_HOST and url: PATH.

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

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

אבחון

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

  • ממשק משתמש של Edge
  • Management APIs

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

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

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

  1. ב-Public Cloud וב-new Edge UI on Private Cloud:
    1. בחר במנהל מערכת.
    2. בוחרים באפשרות Virtual Hosts (מארחים וירטואליים).
    3. לכל Environment, משתמשים במסנן החיפוש כדי לקבוע את Virtual Hosts שתואמים ל-Host Alias הספציפי שבאמצעותו הופעלו בקשות ה-API.
    4. אם מצאתם כמה מארחים וירטואליים שמשתמשים באותו כינוי מארח, כדאי לעבור אל פתרון כדי לפתור את הבעיה.

    למשל:

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

    לדוגמה:

Management APIs

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

      משתמש ב-Private Cloud:

      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
      

      משתמש ב-Private Cloud:

      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
      

      משתמש ב-Private Cloud:

      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:

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

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

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

  • הודעת השגיאה המלאה שזוהתה בבקשות שנכשלו
  • שם הארגון, שם הסביבה ושם ה-API Proxy שבהם נצפו שגיאות 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