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 สาธารณะและ 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

    ตัวอย่างข้อความแสดงข้อผิดพลาดจากบันทึก 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
    

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

เราเตอร์ Edge ของ Apigee และ Message Processor จะใช้ทั้งส่วนหัวของโฮสต์ หมายเลขพอร์ต และเส้นทาง URI เพื่อกำหนดเส้นทางการรับส่งข้อมูลไปยังพร็อกซี API ที่ถูกต้อง มีคำนิยามที่กำกวม เช่น ระบบเสมือนจริงหลายรายการ ระบบจะจัดทำเอกสารโฮสต์ที่มีชื่อแทนโฮสต์และหมายเลขพอร์ตเดียวกัน anti-pattern และ อาจทำให้เกิดพฤติกรรมที่ไม่คาดคิด หนึ่งในข้อผิดพลาดทั่วไปที่คุณจะสังเกตเห็นคือ เกิดข้อผิดพลาด 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 และ EDGE UI ใหม่บน Private Cloud ให้ทําดังนี้
    1. เลือกผู้ดูแลระบบ
    2. เลือกโฮสต์เสมือน
    3. สำหรับแต่ละสภาพแวดล้อม ให้ใช้ตัวกรองการค้นหาเพื่อระบุแท็กเสมือน โฮสต์ที่ตรงกับชื่อแทนโฮสต์ที่ระบุซึ่ง API มีการเรียก
    4. ถ้าคุณพบโฮสต์เสมือนหลายรายการที่ใช้ชื่อแทนโฮสต์เดียวกัน ให้ไปที่ การแก้ปัญหาเพื่อแก้ไขปัญหานี้

    เช่น

  2. ใน UI แบบคลาสสิกบน Private Cloud ให้ทำดังนี้
    1. เลือกแท็บ API
    2. เลือกการกำหนดค่าสภาพแวดล้อม
    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
      

      ผู้ใช้ 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. ทำ 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" : [ ]
      }
      

      ในตัวอย่างนี้ คุณจะเห็นได้ว่าโฮสต์เสมือน 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 รายการ