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

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

ลักษณะปัญหา

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

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

ทำตามวิธีการที่ระบุใน 404 ไม่สามารถระบุพร็อกซีสำหรับโฮสต์: <ชื่อโฮสต์เสมือนจริง> และ url: <path> และแก้ไขข้อผิดพลาดนี้ หากไม่มีสาเหตุใดที่ทำให้เกิดข้อผิดพลาดนี้ ให้ใช้ขั้นตอนด้านล่างเพื่อพิจารณาว่าโฮสต์เสมือนที่มีชื่อแทนโฮสต์ซ้ำกันทำให้เกิดข้อผิดพลาด 404 หรือไม่

การวินิจฉัย

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

  • UI ของ Edge
  • API การจัดการ

UI ของ Edge

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

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

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

    เช่น

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

    เช่น

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. คุณอัปเดตข้อมูลเหล่านี้ได้โดยใช้ Edge UI หรือ 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

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

  • ชื่อองค์กร
  • ชื่อสภาพแวดล้อม
  • ชื่อพร็อกซี API
  • ใช้คำสั่ง curl ให้เสร็จสมบูรณ์เพื่อจำลองข้อผิดพลาด 404 ซ้ำ
  • หากข้อผิดพลาด 404 ไม่ได้เกิดขึ้นในขณะนี้ ให้ระบุระยะเวลาพร้อมข้อมูลเขตเวลาเมื่อเกิดข้อผิดพลาด 404 ในอดีต

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

  • สังเกตข้อความแสดงข้อผิดพลาดสำหรับคำขอที่ไม่สำเร็จ
  • ชื่อองค์กร ชื่อสภาพแวดล้อม และชื่อพร็อกซี API ที่คุณพบข้อผิดพลาด 404 รายการ
  • กลุ่มพร็อกซี 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