404 โฮสต์เสมือนหลายรายการที่มีชื่อแทนเดียวกัน

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่ เอกสารประกอบของ Apigee X
info

ลักษณะปัญหา

แอปพลิเคชันไคลเอ็นต์ได้รับรหัสสถานะ HTTP เป็น 404 พร้อมข้อความ Not Found และข้อความแสดงข้อผิดพลาด Unable to identify proxy for host: VIRTUAL_HOST and url: PATH เป็นการตอบกลับการเรียก API

ข้อผิดพลาดนี้หมายความว่า Edge ไม่พบพร็อกซี 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 และ Private Cloud

ขั้นตอนการวินิจฉัยทั่วไป

บันทึกของ NGINX และ Message Processor จะมีประโยชน์ในการแก้ปัญหาข้อผิดพลาด 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 หรือไม่

    ตัวอย่างข้อความแสดงข้อผิดพลาดจากบันทึกของ Message Processor

  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

สาเหตุ: โฮสต์เสมือนหลายรายการมีนามแฝงโฮสต์และหมายเลขพอร์ตเดียวกัน

เราเตอร์และ Message Processor ของ Apigee Edge ใช้ทั้งส่วนหัวของโฮสต์ หมายเลขพอร์ต และเส้นทาง URI เพื่อกำหนดเส้นทางการรับส่งข้อมูลไปยังพร็อกซี API ที่ถูกต้อง การกำหนดที่คลุมเครือ เช่น โฮสต์ เสมือนหลายรายการมีนามแฝงโฮสต์และหมายเลขพอร์ตเดียวกัน ถือเป็น รูปแบบที่ไม่แนะนำและ อาจทำให้เกิดลักษณะการทำงานที่ไม่คาดคิด ข้อผิดพลาดทั่วไปอย่างหนึ่งที่คุณจะเห็นคือข้อผิดพลาด 404 พร้อมข้อความ Unable to identify proxy for host: VIRTUAL_HOST and url: PATH

โดยปกติแล้ว หากมีโฮสต์เสมือนหลายรายการที่มีนามแฝงโฮสต์เดียวกัน คุณจะเห็น ข้อผิดพลาด 404 เป็นระยะๆ เนื่องจากพร็อกซี API ที่เฉพาะเจาะจงอาจได้รับการกำหนดค่า ให้ยอมรับคำขอในโฮสต์เสมือนเพียงรายการเดียว เมื่อระบบกำหนดเส้นทางคำขอ API ไปยัง โฮสต์เสมือนที่เฉพาะเจาะจงซึ่งกำหนดค่าไว้ในพร็อกซี API คุณจะได้รับการตอบกลับที่สำเร็จ อย่างไรก็ตาม เมื่อระบบกำหนดเส้นทางคำขอ API ไปยังโฮสต์เสมือนอื่นๆ ที่พร็อกซี API ไม่ได้กำหนดค่าให้ยอมรับคำขอ API จะล้มเหลวโดยแสดงข้อผิดพลาด 404 เหล่านี้

ทำตามวิธีการที่ระบุไว้ใน 404 Unable to identify proxy for host: <virtual host name> and url: <path> และ แก้ปัญหาข้อผิดพลาดนี้ หากไม่มีสาเหตุใดที่ทำให้เกิดข้อผิดพลาดนี้ ให้ทำตามขั้นตอน ด้านล่างเพื่อดูว่าโฮสต์เสมือนที่มีนามแฝงโฮสต์ซ้ำทำให้เกิดข้อผิดพลาด 404 หรือไม่

การวินิจฉัย

ใช้วิธีใดวิธีหนึ่งต่อไปนี้เพื่อดูว่ามีโฮสต์เสมือนหลายรายการที่มี นามแฝงโฮสต์/หมายเลขพอร์ตเดียวกันซึ่งทำให้เกิดข้อผิดพลาด 404 หรือไม่

  • UI ของ Edge
  • Management API

UI ของ Edge

ใช้วิธีการเหล่านี้เพื่อดูว่ามีโฮสต์เสมือนหลายรายการที่มีนามแฝงโฮสต์/หมายเลขพอร์ตเดียวกันโดยใช้ UI ของ Edge หรือไม่

ตัวอย่างเช่น หากคุณเห็นข้อผิดพลาด 404 ที่มี URL http://example.com:9001/proxy1 คุณต้องค้นหาโฮสต์เสมือนที่มี นามแฝงโฮสต์ example.com และพอร์ต 9001

  1. ใน Public Cloud และ UI ของ Edge ใหม่ใน Private Cloud:
    1. เลือกผู้ดูแลระบบ
    2. เลือกโฮสต์เสมือน
    3. สำหรับแต่ละสภาพแวดล้อม ให้ใช้ตัวกรองการค้นหาเพื่อระบุโฮสต์เสมือน ที่ตรงกับนามแฝงโฮสต์ ที่เฉพาะเจาะจงซึ่งใช้เรียกคำขอ API
    4. หากพบโฮสต์เสมือน หลายรายการที่ใช้นามแฝงโฮสต์ เดียวกัน ให้ไปที่ ส่วนความละเอียดเพื่อแก้ปัญหานี้

    ตัวอย่างเช่น

  2. ใน UI แบบคลาสสิกใน Private Cloud:
    1. เลือกแท็บ API
    2. เลือกการกำหนดค่าสภาพแวดล้อม
    3. เลือกโฮสต์เสมือน
    4. สำหรับแต่ละสภาพแวดล้อม ให้ดูรายการโฮสต์เสมือน เพื่อดูว่ามีโฮสต์เสมือนใดตรงกับ นามแฝงโฮสต์ ที่เฉพาะเจาะจงซึ่งใช้เรียกคำขอ API หรือไม่
    5. หากพบโฮสต์เสมือน หลายรายการที่ตรงกับนามแฝงโฮสต์ เดียวกัน ให้ไปที่ ส่วนความละเอียด เพื่อแก้ปัญหานี้

    ตัวอย่างเช่น

Management API

ใช้วิธีการเหล่านี้เพื่อดูว่ามีโฮสต์เสมือนหลายรายการที่มีนามแฝงโฮสต์/หมายเลขพอร์ตเดียวกันโดยใช้ Management 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
      

      ผู้ใช้ 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. รับรายการโฮสต์เสมือนในสภาพแวดล้อม

      ผู้ใช้ Public Cloud:

      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. รับคำจำกัดความของโฮสต์เสมือนแต่ละรายการในสภาพแวดล้อม

      ผู้ใช้ Public Cloud:

      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. ทำซ้ำ 2 ขั้นตอนข้างต้นสำหรับสภาพแวดล้อมอื่นๆ ในองค์กร

      ในตัวอย่างนี้ ให้ทำซ้ำขั้นตอนสำหรับสภาพแวดล้อม 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" : [ ]
      }

      ในตัวอย่างนี้ คุณจะเห็นว่าโฮสต์เสมือน 2 รายการ default ในสภาพแวดล้อม 2 รายการที่ต่างกัน test และ dev มีนามแฝงโฮสต์ example.com และหมายเลขพอร์ต 9001 เหมือนกัน ซึ่งเป็นสาเหตุของข้อผิดพลาด 404

    5. หากพบโฮสต์เสมือน หลายรายการที่ตรงกับนามแฝงโฮสต์ เดียวกัน ให้ไปที่ ส่วนความละเอียด เพื่อแก้ปัญหานี้

ความละเอียด

  1. ตรวจสอบว่าโฮสต์เสมือนแต่ละรายการมีเพียงนามแฝงโฮสต์และพอร์ตที่ผสมกันแบบไม่ซ้ำกัน
  2. หากคุณระบุโฮสต์เสมือนหลายรายการที่มีนามแฝงโฮสต์และพอร์ตที่ผสมกันแบบเดียวกัน คุณต้องอัปเดตโฮสต์เสมือนเหล่านั้นด้วยนามแฝงโฮสต์ที่ไม่ซ้ำกัน
  3. คุณอัปเดตโฮสต์เสมือนเหล่านี้ได้โดยใช้ UI ของ 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 ไปยังพร็อกซีอีกครั้งและตรวจสอบว่าคุณได้รับการตอบกลับที่สำเร็จอย่างสม่ำเสมอ
    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
  • คำสั่ง curl ที่สมบูรณ์เพื่อจำลองข้อผิดพลาด 404
  • หากข้อผิดพลาด 404 ไม่เกิดขึ้นในขณะนี้ โปรดระบุช่วงเวลา พร้อมข้อมูลเขตเวลาที่ข้อผิดพลาด 404 เกิดขึ้นในอดีต

หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้

  • ข้อความแสดงข้อผิดพลาดทั้งหมดที่พบสำหรับคำขอที่ล้มเหลว
  • ชื่อองค์กร ชื่อสภาพแวดล้อม และชื่อพร็อกซี API ที่คุณเห็น 404 ข้อผิดพลาด
  • App Bundle ของพร็อกซี API
  • บันทึกการเข้าถึงของ NGINX
    /opt/apigee/var/log/edge-router/nginx/ORGANIZATION_NAME~ENVIRONMENT_NAME.PORT#_access_log
  • บันทึกของ Message Processor
    /opt/apigee/var/log/edge-message-processor/logs/system.log
  • ช่วงเวลาพร้อมข้อมูลเขตเวลาที่ข้อผิดพลาด 404 เกิดขึ้น