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

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

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

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

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

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

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

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

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

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

ลายป้องกัน

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

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

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

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

การตั้งค่าข้างต้นอาจมี 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 ไปยังโฮสต์เสมือนทั้ง 2 แห่ง ขณะที่คําขอจริงมีเป้าหมายให้ส่งไปยังโฮสต์เสมือนเพียงโฮสต์เดียว

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

มีอิทธิพล

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

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

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

    Vhost 2 คน

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