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. בודקים את השדות הבאים ברשומות ביומן:
    שדה ערך
    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 כדי לנתב תנועה לשרת ה-proxy הנכון של ה-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 של המארח: <שם מארח וירטואלי> וכתובת URL: <path> וגם לפתור את השגיאה. אם אף אחד מהגורמים לשגיאה הזו לא גורם לשגיאה, פועלים לפי השלבים. למטה כדי לקבוע אם מארחים וירטואליים עם כינויי מארח כפולים גורמים ל-404 שגיאות.

אבחון

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

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

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

ההוראות הבאות מאפשרות לך לקבוע אם יש כמה מארחים וירטואליים עם אותו מארח כתובת אימייל חלופית/יציאה # באמצעות ממשק המשתמש של Edge.

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

  1. ב-Public Cloud ובממשק המשתמש החדש של 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. הצגה של רשימת הסביבות

      משתמש ב-Public Cloud:

      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. הצגת רשימה של מארחים וירטואליים בסביבה

      משתמש ב-Public Cloud:

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

      משתמש ב-Public Cloud:

      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, עליכם לספק את הפרטים הבאים:

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

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

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