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

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

ใน Apigee Edge เราเตอร์จะจัดการการรับส่งข้อมูลของ API ขาเข้าทั้งหมด หมายความว่า HTTP และ HTTPS ทั้งหมด Edge Router จะจัดการคำขอไปยังพร็อกซี Edge API ก่อน ดังนั้น คำขอพร็อกซี API ต้องไปยังที่อยู่ IP และเปิดพอร์ตบนเราเตอร์

โฮสต์เสมือนช่วยให้คุณสามารถโฮสต์ชื่อโดเมนหลายชื่อบนเซิร์ฟเวอร์เดียวหรือกลุ่มเซิร์ฟเวอร์เดียว สำหรับ Edge เซิร์ฟเวอร์จะสอดคล้องกับ Edge Router การกำหนดโฮสต์เสมือนบนเราเตอร์ทำให้คุณสามารถ จัดการคำขอไปยังหลายโดเมน

โฮสต์เสมือนบน Edge จะกำหนดโปรโตคอล (HTTP หรือ HTTPS) รวมถึงพอร์ตเราเตอร์และชื่อแทนโฮสต์ โดยทั่วไปชื่อแทนโฮสต์จะเป็นชื่อโดเมน DNS ที่แมปกับที่อยู่ IP ของเราเตอร์

ตัวอย่างเช่น รูปภาพต่อไปนี้แสดงเราเตอร์ที่มีคำจำกัดความโฮสต์เสมือน 2 รายการ

ในตัวอย่างนี้ มีคำจำกัดความของโฮสต์เสมือน 2 อย่าง บัญชีหนึ่งจะจัดการกับคำขอ HTTPS ใน domainName1 อีกโดเมนหนึ่งจะจัดการคำขอ HTTP ใน domainName2

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

ตัวอย่างการกำหนดค่าสำหรับโฮสต์เสมือนจะแสดงอยู่ด้านล่าง

ตัวอย่างการกำหนดค่า vhost

ลาย Antipattern

การกำหนดโฮสต์เสมือนหลายรายการด้วยชื่อแทนโฮสต์และหมายเลขพอร์ตเดียวกัน กับสภาพแวดล้อมขององค์กรหรือข้ามองค์กร จะทำให้เกิดความสับสน การกำหนดเส้นทางคำขอ API และอาจส่งผลให้เกิดข้อผิดพลาด/ลักษณะการทำงานที่ไม่คาดคิด

ลองใช้ตัวอย่างเพื่ออธิบายผลกระทบของการมีโฮสต์เสมือนหลายรายการที่มีชื่อแทนโฮสต์เดียวกัน

สมมติว่ามีโฮสต์เสมือน 2 รายการที่sandbox and secure กำหนดไว้ ที่มีชื่อแทนโฮสต์เดียวกัน เช่น api.company.abc.com ในสภาพแวดล้อม:

vhosts ที่มีชื่อแทนเดียวกัน

การตั้งค่าข้างต้นอาจเป็นไปได้ 2 กรณีตามที่อธิบายไว้ในส่วนต่อไปนี้

สถานการณ์ที่ 1 : มีการกำหนดค่าพร็อกซี API ให้ยอมรับคำขอไปยังพร็อกซีเสมือนเพียง 1 รายการ โฮสต์แซนด์บ็อกซ์

<ProxyEndpoint name="default">
  ...
  <HTTPProxyConnection>
    <BasePath>/demo</BasePath>
    <VirtualHost>sandbox</VirtualHost>
  </HTTPProxyConnection>
  ...
</ProxyEndpoint>

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

Unable to identify proxy for host: secure 

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

สถานการณ์ที่ 2 : มีการกำหนดค่าพร็อกซี API ให้ยอมรับคำขอจากทั้งแซนด์บ็อกซ์ของโฮสต์เสมือนและรักษาความปลอดภัย

<ProxyEndpoint name="default">
  ...
  <HTTPProxyConnection>
    <BasePath>/demo</BasePath>
    <VirtualHost>sandbox</VirtualHost>
    <VirtualHost>secure</VirtualHost>
  </HTTPProxyConnection>
  ...
</ProxyEndpoint>

ในสถานการณ์นี้ เมื่อแอปพลิเคชันไคลเอ็นต์ทำการเรียกไปยังพร็อกซี API ที่ระบุโดยใช้ ชื่อแทนโฮสต์ api.company.abc.com พวกเขาจะได้รับการตอบกลับที่ถูกต้องตามตรรกะของพร็อกซี

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

ซึ่งอาจส่งผลต่อข้อมูลการบันทึกและข้อมูลอื่นๆ ที่อิงตามโฮสต์เสมือนด้วย

ผลกระทบ

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

แนวทางปฏิบัติแนะนำ

  • โปรดอย่ากำหนดโฮสต์เสมือนหลายรายการโดยใช้ชื่อแทนโฮสต์และหมายเลขพอร์ตเดียวกันในสภาพแวดล้อมเดียวกัน หรือสภาพแวดล้อมต่างๆ ขององค์กร
  • หากจำเป็นต้องกำหนดโฮสต์เสมือนหลายรายการ ให้ใช้ชื่อแทนโฮสต์ที่แตกต่างกันในแต่ละโฮสต์ โฮสต์เสมือนดังที่แสดงด้านล่าง

    2 Vhost

อ่านเพิ่มเติม