Antipattern: Menentukan beberapa host virtual dengan alias host dan nomor port yang sama

Anda sedang melihat dokumentasi Apigee Edge.
Buka Dokumentasi Apigee X.
info

Di Apigee Edge, Router menangani semua traffic API yang masuk. Artinya, semua HTTP dan HTTPS ke proxy Edge API ditangani terlebih dahulu oleh Router Edge. Oleh karena itu, permintaan proxy API harus diarahkan ke alamat IP dan membuka porta di {i>Router<i}.

Host virtual memungkinkan Anda menghosting beberapa nama domain pada satu server atau sekelompok server. Untuk Edge, server sesuai dengan Router Edge. Dengan menentukan {i>host<i} virtual pada {i>Router<i}, Anda dapat menangani permintaan ke beberapa domain.

Host virtual di Edge menentukan protokol (HTTP atau HTTPS), beserta port Router dan alias host. Alias host biasanya adalah nama domain DNS yang memetakan ke alamat IP Router.

Misalnya, gambar berikut menunjukkan Router dengan dua definisi host virtual:

Dalam contoh ini, ada dua definisi {i>host<i} virtual. Satu menangani permintaan HTTPS pada domain domainName1, sedangkan yang lain menangani permintaan HTTP pada domainName2.

Pada permintaan ke proxy API, Router membandingkan header Host dan nomor port permintaan ke daftar alias host yang ditetapkan oleh semua host virtual untuk menentukan {i>virtual host <i} menangani permintaan itu.

Contoh konfigurasi untuk host virtual ditunjukkan di bawah ini:

contoh konfigurasi vhost

Anti-pola

Menentukan beberapa {i>host<i} virtual dengan alias {i>host<i} dan nomor port yang sama dalam suatu organisasi atau seluruh organisasi akan menyebabkan kebingungan pada saat mengarahkan permintaan API dan dapat menyebabkan error/perilaku yang tidak terduga.

Mari kita gunakan contoh untuk menjelaskan implikasi dari memiliki beberapa {i>host<i} virtual dengan alias {i>host<i} yang sama.

Misalkan ada dua host virtual yang sandbox and secure ditentukan dengan alias {i>host<i} yang sama, yaitu api.company.abc.com dalam lingkungan:

vhosts dengan alias yang sama

Dengan penyiapan di atas, mungkin ada dua skenario seperti yang dijelaskan di bagian berikut.

Skenario 1 : Proxy API dikonfigurasi untuk menerima permintaan hanya ke salah satu sandbox host

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

Dalam skenario ini, ketika aplikasi klien melakukan panggilan ke Proxy API tertentu menggunakan alias host api.company.abc.com, pengguna sesekali akan mendapatkan error 404 dengan pesan:

Unable to identify proxy for host: secure 

Hal ini karena Router mengirimkan permintaan ke sandbox dan secure {i>host<i} virtual. Saat permintaan dirutekan ke host virtual sandbox, aplikasi klien akan mendapatkan respons yang berhasil. Namun, saat permintaan dirutekan ke host virtual secure, aplikasi klien akan mendapatkan error 404 karena Proxy API tidak dikonfigurasi untuk menerima Host virtual secure.

Skenario 2 : Proxy API dikonfigurasi untuk menerima permintaan ke sandbox virtual host dan mengamankan

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

Dalam skenario ini, ketika aplikasi klien melakukan panggilan ke Proxy API tertentu menggunakan alias host api.company.abc.com, pengguna akan mendapatkan respons valid berdasarkan logika proxy.

Namun, hal ini menyebabkan data yang salah disimpan di Analytics saat permintaan API dirutekan ke baik {i>host<i} virtual, sementara permintaan yang sebenarnya dimaksudkan untuk dikirim hanya ke satu {i>host<i} virtual.

Hal ini juga dapat memengaruhi informasi logging dan data lain yang didasarkan pada host virtual.

Dampak

  1. Error 404 karena permintaan API mungkin dirutekan ke host virtual yang mungkin tidak dituju Proxy API dikonfigurasi untuk menerima permintaan.
  2. Data Analytics salah karena permintaan API dirutekan ke semua host virtual yang memiliki alias {i>host<i} yang sama sementara permintaan dibuat hanya untuk {i>host<i} virtual tertentu.

Praktik Terbaik

  • Jangan tentukan beberapa {i>host<i} virtual dengan alias {i>host<i} dan nomor port yang sama di lingkungan yang sama, atau lingkungan organisasi yang berbeda.
  • Jika ada kebutuhan untuk mendefinisikan beberapa {i>host<i} virtual, maka gunakan alias {i>host<i} yang berbeda di setiap host virtual seperti yang ditunjukkan di bawah ini:

    dua vhost

Bacaan lebih lanjut