Sebuah paket hosting seharga puluhan ribu rupiah per bulan tetap memberi Anda alamat website dengan nama domain sendiri. Padahal server yang menjalankannya dipakai bersama puluhan hingga ratusan pelanggan lain, dan semuanya berbagi satu alamat IP yang sama.

Di sinilah muncul satu pertanyaan yang wajar. Kalau semua domain itu menunjuk ke alamat yang sama, bagaimana server tahu bahwa permintaan yang baru masuk ditujukan untuk website Anda, bukan untuk website tetangga? Jawabannya terletak pada satu mekanisme yang usianya hampir sama dengan web itu sendiri.

Apa Itu Virtual Host?

Virtual host adalah blok konfigurasi pada web server yang menentukan website mana yang harus disajikan untuk sebuah nama domain. Berkat virtual host, satu server dengan satu alamat IP dapat melayani banyak domain sekaligus, masing-masing dengan folder berkas, catatan log, dan pengaturannya sendiri.

Istilahnya sering muncul dalam dua bentuk. Virtual hosting menunjuk pada mekanismenya secara umum, yaitu kemampuan satu server menampung banyak situs. Virtual host menunjuk pada satu blok konfigurasi untuk satu situs. Di kalangan administrator server, bentuk singkatnya adalah vhost.

Cara paling mudah membayangkannya adalah sebuah gedung perkantoran dengan satu alamat pos. Puluhan perusahaan menyewa ruangan di dalamnya, dan seluruh surat untuk mereka dikirim ke alamat yang sama. Yang membuat surat sampai ke penyewa yang benar adalah nama perusahaan yang tertulis di amplop, dibaca oleh resepsionis di lobi. Virtual host adalah daftar nama penyewa yang dipegang resepsionis itu.

Fungsinya bukan sekadar memilah. Setiap blok virtual host membawa pengaturannya sendiri: folder tempat berkas disimpan, berkas log yang terpisah, dan sertifikat keamanan yang berbeda. Bahkan aturan aksesnya pun tidak berlaku untuk domain lain di server yang sama.

Kenapa Satu Server Bisa Menampung Banyak Domain

Mekanisme ini tidak selalu ada. Pada spesifikasi HTTP/1.0 yang terbit Mei 1996, permintaan dari browser hanya memuat jalur berkas yang diminta, misalnya GET /index.html. Nama domain sama sekali tidak ikut dikirim. Server benar-benar buta terhadap situs mana yang sedang dituju, sehingga satu website praktis membutuhkan satu alamat IP sendiri.

HTTP/1.1 menutup celah itu dengan menambahkan header bernama Host, yaitu baris tambahan di dalam permintaan yang menyebutkan nama domain tujuan. Standar HTTP yang berlaku sekarang mewajibkannya tanpa pengecualian. Klien harus mengirim header Host di setiap permintaan HTTP/1.1. Server harus membalas 400 Bad Request bila header itu hilang, ganda, atau tidak valid.

Kami menguji aturan tersebut pada Apache 2.4.67. Permintaan GET / HTTP/1.1 tanpa header Host memang dibalas 400 Bad Request. Permintaan yang sama dalam bentuk GET / HTTP/1.0 justru dibalas 200 OK, karena versi lama itu tidak pernah mensyaratkan Host sejak awal.

Faktor kedua bersifat ekonomis. Persediaan alamat IPv4 di tingkat global habis pada 3 Februari 2011, dan wilayah Asia Pasifik justru yang paling cepat terkena. APNIC, registri yang membagikan alamat IP untuk Indonesia, menjadi registri regional pertama yang mencapai blok terakhirnya pada 15 April 2011. Sejak saat itu anggotanya hanya boleh menerima jatah maksimal satu blok /22, atau sekitar 1.024 alamat.

Menyediakan satu alamat IP per website menjadi mahal dan tidak masuk akal. Virtual host mengubah alamat IP dari kebutuhan setiap situs menjadi sumber daya bersama, dan dari situlah layanan hosting bersama bisa dijual dengan harga terjangkau.

Cara Kerja Virtual Host: Dari Header Host ke Folder

Perjalanan sebuah permintaan melewati dua lapisan yang sering tertukar. Lapisan pertama adalah DNS, yang menerjemahkan nama domain menjadi alamat IP. Tugas DNS berhenti di situ: ia hanya mengantar permintaan sampai ke pintu mesin yang benar.

Lapisan kedua adalah web server, dan di lapisan inilah virtual host bekerja. Setelah koneksi masuk, server membaca header Host di dalam permintaan, mencocokkannya dengan daftar blok konfigurasi yang dimilikinya, lalu mengambil berkas dari folder yang ditetapkan blok tersebut.

Empat tahap: DNS memberi alamat IP, koneksi ke port 80, header Host dicocokkan ke ServerName, berkas dari DocumentRoot.Empat tahap: DNS memberi alamat IP, koneksi ke port 80, header Host dicocokkan ke ServerName, berkas dari DocumentRoot.

Pencocokan itu sendiri berlangsung dalam dua tahap, dan urutannya penting. Tahap pertama menyaring berdasarkan alamat IP dan port yang dipakai koneksi. Tahap kedua baru membandingkan nama domain pada header Host dengan direktif ServerName dan ServerAlias di setiap blok yang lolos tahap pertama.

Bagaimana kalau tidak ada satu pun nama yang cocok? Server tidak menampilkan halaman kesalahan. Ia memakai blok virtual host pertama yang tercantum untuk alamat dan port tersebut. Pada pengujian kami, permintaan dengan header Host: tidakada.uji.test disajikan oleh blok pertama, sama persis seperti permintaan tanpa header Host sekali pun.

Perilaku ini yang membuat dokumentasi Apache menyarankan agar ServerName selalu ditulis eksplisit di setiap virtual host berbasis nama. Blok pertama dalam daftar bukan sekadar yang pertama dibaca, melainkan sekaligus penampung semua permintaan yang tidak dikenali.

Nginx memakai pendekatan yang setara dengan istilah berbeda. Permintaan yang nama domainnya tidak cocok dengan server_name mana pun akan dilayani oleh default server untuk port itu, yaitu blok pertama atau blok yang ditandai default_server secara eksplisit.

Tiga Jenis Virtual Host

Pembeda antar-virtual host tidak selalu nama domain. Ada tiga cara yang lazim dipakai, dan ketiganya bisa berjalan berdampingan di satu server.

JenisPembedanyaKapan dipakai
Name-basedHeader HostHampir semua hosting
IP-basedAlamat IPIsolasi sertifikat atau layanan
Port-basedNomor portUji coba dan panel internal

Name-based adalah jenis yang dibahas sejauh ini dan menjadi bentuk paling umum. Banyak domain berbagi satu alamat IP, dan header Host yang memisahkan mereka. Konfigurasinya paling hemat karena penambahan domain baru tidak membutuhkan alamat IP tambahan.

IP-based memberi setiap situs alamat IP sendiri, sehingga server tidak perlu membaca header Host untuk mengenalinya. Syaratnya jelas: mesin harus benar-benar memiliki kombinasi alamat dan port yang berbeda untuk setiap blok, baik lewat kartu jaringan tambahan maupun alamat virtual pada kartu yang sama. Jenis ini masih dipakai saat sebuah layanan membutuhkan pemisahan penuh di tingkat jaringan.

Port-based membedakan situs lewat nomor port, misalnya contoh.test:8080 dan contoh.test:8081. Pengunjung harus mengetik nomor portnya, sehingga bentuk ini jarang dipakai untuk website publik. Sebaliknya, ia praktis untuk menjalankan beberapa aplikasi uji coba di satu mesin pengembangan.

Name-based: tiga domain ke satu IP. IP-based: tiap domain punya IP sendiri. Port-based: satu domain tiga port.Name-based: tiga domain ke satu IP. IP-based: tiap domain punya IP sendiri. Port-based: satu domain tiga port.

Anatomi Berkas Konfigurasi Virtual Host

Sebuah virtual host di Apache berbentuk blok yang dibuka dan ditutup seperti tag. Berikut satu blok utuh untuk sebuah domain beserta versi ber-www-nya:

APACHE
<VirtualHost *:80>
    ServerName contoh.co.id
    ServerAlias www.contoh.co.id
    DocumentRoot /var/www/contoh/public
    ErrorLog /var/log/apache2/contoh-error.log
    CustomLog /var/log/apache2/contoh-access.log combined

    <Directory /var/www/contoh/public>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Setiap barisnya punya tugas yang berbeda:

  1. <VirtualHost *:80>: menentukan alamat dan port yang dilayani blok ini. Tanda bintang berarti seluruh alamat IP yang dimiliki mesin, sedangkan 80 adalah port standar untuk koneksi tanpa enkripsi.
  2. ServerName: nama domain utama yang dicocokkan dengan header Host. Ini direktif yang paling menentukan, sekaligus yang paling sering terlupa ditulis.
  3. ServerAlias: nama tambahan yang juga dilayani blok yang sama, dan menerima karakter pengganti seperti *.contoh.co.id.
  4. DocumentRoot: folder tempat berkas website disimpan. Permintaan ke /tentang.html akan dicarikan berkas dengan nama tersebut di dalam folder ini.
  5. ErrorLog dan CustomLog: berkas catatan terpisah untuk domain ini, sehingga penelusuran masalah tidak tercampur dengan domain lain di server yang sama.
  6. Blok <Directory>: aturan akses untuk folder tujuan. Require all granted mengizinkan pengunjung membacanya, sementara AllowOverride All menentukan sejauh mana berkas .htaccess boleh menimpa aturan di sini.

Tujuh baris blok VirtualHost berlabel: ServerName domain utama, ServerAlias domain tambahan, DocumentRoot folder website.Tujuh baris blok VirtualHost berlabel: ServerName domain utama, ServerAlias domain tambahan, DocumentRoot folder website.

Letak berkas virtual host Apache berbeda-beda tergantung cara pemasangannya. Pada Debian dan Ubuntu, setiap domain ditulis sebagai berkas terpisah di /etc/apache2/sites-available/, lalu diaktifkan dengan perintah a2ensite yang membuat tautan simbolik ke /etc/apache2/sites-enabled/. Jalur ini sama persis di Ubuntu 22.04 maupun 24.04. Pada paket bawaan Apache dan XAMPP, seluruh blok umumnya berkumpul di satu berkas conf/extra/httpd-vhosts.conf.

Dari situ muncul aturan yang sering ditanyakan: berkas virtual host harus berakhiran .conf. Perlu diperhatikan bahwa ini bukan aturan Apache, melainkan konsekuensi cara paket Debian dan Ubuntu memuat konfigurasinya. Berkas utamanya memakai pola IncludeOptional sites-enabled/*.conf, dan pola itu mengabaikan berkas apa pun yang namanya tidak berakhiran .conf. Berkas bernama contoh.co.id tanpa akhiran akan diabaikan tanpa pesan kesalahan sedikit pun.

Di Nginx, konsep yang sama muncul dengan nama lain. Sebuah virtual host Nginx tidak memakai direktif bernama VirtualHost; padanannya adalah blok server dengan server_name sebagai penentu nama domain dan root sebagai folder berkasnya.

Nginx
server {
    listen 80;
    server_name contoh.co.id www.contoh.co.id;
    root /var/www/contoh/public;
}

Blok terpisah untuk HTTPS

Koneksi aman tidak dilayani oleh blok yang sama. Karena setiap domain membawa sertifikat SSL sendiri, blok untuk HTTPS ditulis terpisah pada port 443. Pola yang paling lazim memakai dua blok untuk satu domain: blok port 80 yang hanya mengalihkan pengunjung, dan blok port 443 yang benar-benar menyajikan isinya.

APACHE
<VirtualHost *:80>
    ServerName contoh.co.id
    Redirect permanent / https://contoh.co.id/
</VirtualHost>

Kami menguji blok pengalih di atas pada Apache 2.4.67. Permintaan ke /tentang.html dibalas kode 301 dengan tujuan https://contoh.co.id/tentang.html, jadi jalur halaman ikut terbawa dan pengunjung tidak terlempar ke beranda.

Membuat Virtual Host di XAMPP untuk Proyek Lokal

Di komputer sendiri, virtual host membuat proyek Anda dapat diakses lewat alamat seperti http://tokosaya.test alih-alih http://localhost/tokosaya. Alamat yang rapi itu penting karena sebagian aplikasi berperilaku berbeda saat dijalankan dari subfolder. Pengaturan virtual host XAMPP sendiri tersebar di dua berkas konfigurasi, dan keduanya perlu disunting berurutan.

Langkah #1: Aktifkan berkas virtual host

Buka C:\xampp\apache\conf\httpd.conf, cari baris berikut, lalu hapus tanda pagar di depannya:

APACHE
Include conf/extra/httpd-vhosts.conf

Tanpa langkah ini, berkas virtual host tidak pernah dibaca sekali pun isinya sudah benar.

Langkah #2: Tulis blok virtual host

Buka C:\xampp\apache\conf\extra\httpd-vhosts.conf lalu tambahkan dua blok di bagian bawah:

APACHE
<VirtualHost *:80>
    ServerName localhost
    DocumentRoot "C:/xampp/htdocs"
</VirtualHost>

<VirtualHost *:80>
    ServerName tokosaya.test
    DocumentRoot "C:/xampp/htdocs/tokosaya/public"
    <Directory "C:/xampp/htdocs/tokosaya/public">
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Blok localhost sengaja ditulis lebih dulu. Alasannya berkaitan langsung dengan aturan yang dibahas sebelumnya: begitu blok virtual host pertama muncul, http://localhost berhenti menampilkan folder htdocs dan ikut jatuh ke blok pertama dalam daftar. Menuliskan localhost sebagai blok teratas mengembalikan perilaku semula.

Langkah #3: Kenalkan nama domain ke komputer Anda

Nama tokosaya.test tidak terdaftar di DNS mana pun, sehingga komputer Anda perlu diberi tahu ke mana harus mengarahkannya. Buka C:\Windows\System32\drivers\etc\hosts dengan hak administrator, lalu tambahkan satu baris:

TEXT
127.0.0.1    tokosaya.test

Alamat 127.0.0.1 menunjuk ke komputer Anda sendiri, seperti dijelaskan pada artikel localhost. Baris ini menggantikan peran DNS di lapisan pertama, sementara virtual host mengerjakan lapisan keduanya.

Langkah #4: Nyalakan ulang Apache dan periksa hasilnya

Tekan Stop lalu Start pada modul Apache di panel kontrol XAMPP. Buka http://tokosaya.test di browser. Bila yang muncul justru halaman XAMPP atau proyek lain, hampir selalu penyebabnya ada di urutan blok atau penulisan ServerName, bukan pada berkas website Anda.

Akhiran .test dipakai karena statusnya dicadangkan untuk pengujian dan tidak akan pernah dijual sebagai domain sungguhan. Menghindari akhiran .dev atau nama domain nyata mencegah bentrok dengan alamat yang benar-benar ada di internet.

Virtual Host di cPanel dan Panel Hosting Lain

Sebagian besar pengguna hosting tidak pernah menyunting berkas ini, dan memang tidak perlu. Setiap kali Anda menambahkan addon domain atau subdomain lewat cPanel, panel menuliskan blok virtual host baru di balik layar. Blok itu sudah lengkap dengan folder tujuan dan catatan lognya, dan konfigurasi Apache langsung dimuat ulang.

Hal itu sekaligus menjelaskan mengapa berkas vhost tidak dapat Anda sunting sendiri di hosting bersama. Menyuntingnya menuntut akses root ke seluruh server, dan itu baru tersedia di VPS dengan kendali penuh atau server khusus.

Memahami hal itu membuat beberapa aturan paket hosting menjadi masuk akal. Batas jumlah addon domain bukan batasan yang dibuat-buat, melainkan batas jumlah blok virtual host yang boleh Anda miliki di server bersama. Perbedaan antara addon domain, parked domain, dan subdomain juga berakar pada bentuk blok yang dihasilkan, dan perbandingannya dibahas pada panduan perbedaan sub, parked, dan addon domain.

Empat Kesalahan yang Membuat Virtual Host Tidak Bekerja

Gejalanya hampir selalu sama: semua domain menampilkan website yang sama, atau perubahan konfigurasi seperti tidak berpengaruh. Penyebabnya biasanya salah satu dari empat hal berikut.

  1. Satu blok beralamat IP eksplisit mematikan seluruh blok wildcard: ini yang paling sulit ditebak. Pengujian kami memakai dua blok *:8088 yang sudah bekerja normal. Setelah satu blok <VirtualHost 127.0.0.1:8088> ditambahkan, seluruh permintaan ke alamat itu disajikan blok baru tersebut, tanpa peduli nama domain yang diminta. Kedua blok lama menjadi tidak terjangkau sepenuhnya. Penyebabnya adalah tahap pertama pencocokan: alamat IP yang ditulis eksplisit selalu menang atas tanda bintang, dan blok yang kalah di tahap itu tidak pernah ikut dibandingkan namanya.
  2. ServerName salah tulis atau tidak ditulis: blok tanpa nama yang cocok tidak akan pernah terpilih, dan permintaannya jatuh ke blok pertama. Inilah sebab paling umum semua domain menampilkan isi yang sama.
  3. Masih menuliskan NameVirtualHost: direktif ini dahulu wajib ditulis untuk mengaktifkan virtual host berbasis nama, tetapi sejak Apache 2.3.11 fungsinya sudah otomatis. Saat kami menambahkannya di Apache 2.4.67, pemeriksaan konfigurasi membalas AH00548: NameVirtualHost has no effect and will be removed in the next release. Menuliskannya sekarang tidak berbahaya, tetapi juga tidak berguna.
  4. Berkas benar tetapi belum aktif: berkas tanpa akhiran .conf diabaikan, dan berkas di sites-available yang belum di-a2ensite tidak pernah dibaca. Perubahan apa pun juga baru berlaku setelah Apache dimuat ulang.

Satu blok beralamat IP eksplisit menyerap seluruh permintaan, sehingga dua blok VirtualHost bertanda bintang terabaikan.Satu blok beralamat IP eksplisit menyerap seluruh permintaan, sehingga dua blok VirtualHost bertanda bintang terabaikan.

Sebelum menebak-nebak, jalankan perintah berikut untuk melihat apa yang benar-benar dibaca Apache:

Bash
apachectl -S

Keluarannya menampilkan setiap alamat dan port, blok mana yang menjadi default server untuk alamat tersebut, seluruh nama domain beserta aliasnya, dan nomor baris berkas asal setiap blok. Bila sebuah domain tidak muncul di daftar itu, masalahnya ada di pemuatan berkas, bukan di isi bloknya.

Kelemahan Virtual Host yang Perlu Anda Pertimbangkan

Virtual host bukan mekanisme tanpa konsekuensi. Empat hal berikut layak Anda ketahui sebelum bergantung sepenuhnya padanya.

  1. HTTPS bergantung pada SNI: saat koneksi terenkripsi dibuat, server harus memilih sertifikat sebelum sempat membaca header Host. Masalah itu diselesaikan SNI (Server Name Indication), perluasan TLS yang mengirim nama domain lebih awal dalam proses jabat tangan. Karena itu blok virtual host untuk koneksi aman ditulis terpisah pada port 443, bukan port 80. Konsekuensi lainnya, nama domain yang Anda tuju terkirim tanpa enkripsi, dan klien yang sangat lawas tidak mendukung SNI sama sekali. Perinciannya dibahas pada artikel HTTPS.
  2. Satu kesalahan menjatuhkan semuanya: seluruh blok dibaca oleh satu proses yang sama. Kesalahan penulisan di berkas milik satu domain membuat pemuatan ulang gagal, dan domain lain di server itu ikut tidak menerima perubahan.
  3. Pemisahan bersifat konfigurasi, bukan sistem: virtual host memisahkan folder dan pengaturan, bukan proses dan sumber daya. Situs yang menghabiskan CPU tetap memengaruhi tetangganya di mesin yang sama. Pemisahan yang benar-benar terpisah membutuhkan container atau VPS sendiri.
  4. Header Host dikirim oleh klien: nilainya bisa diisi apa saja, termasuk nama yang tidak pernah tercatat di DNS. Penguji keamanan memanfaatkannya untuk menyisir blok virtual host tersembunyi, misalnya panel administrasi atau lingkungan uji coba yang seharusnya tidak publik. Teknik ini dikenal sebagai virtual host enumeration. Perilaku jatuh ke blok pertama justru yang menentukan penyisiran itu berhasil atau tidak, karena balasan yang seragam menyamarkan keberadaan blok lain.

Pertanyaan yang Sering Muncul Seputar Virtual Host

Apa perbedaan antara host dan virtual host?

Host adalah mesin nyata yang terhubung ke jaringan dan memiliki alamat IP. Virtual host adalah identitas logis di dalam mesin tersebut, yang hanya ada sebagai blok konfigurasi. Satu host dapat menampung ratusan virtual host, tetapi sebuah virtual host tidak dapat berdiri tanpa host yang menjalankannya.

Apa itu virtual hostname?

Virtual hostname adalah nama domain yang dilayani sebuah blok virtual host, yaitu nilai yang Anda tulis pada ServerName atau ServerAlias. Nama ini tidak harus sama dengan hostname mesin itu sendiri, dan pada praktiknya memang hampir selalu berbeda.

Untuk membuat virtual host digunakan aplikasi apa?

Tidak ada aplikasi khusus. Virtual host adalah berkas teks biasa, sehingga penyuntingnya cukup editor teks apa pun, misalnya Notepad, nano, atau vi. Yang membaca dan menjalankan berkas itu adalah web server, umumnya Apache atau Nginx. Untuk keperluan lokal, paket seperti XAMPP dan Laragon sudah menyertakan Apache beserta berkas virtual host bawaannya.

Setiap berkas virtual host harus berakhiran apa?

Berakhiran .conf. Nama file-nya sendiri bebas, yang mengikat hanya akhirannya. Aturan ini berlaku pada Debian, Ubuntu, dan turunannya, karena berkas konfigurasi utamanya hanya memuat berkas dengan akhiran tersebut. Pada Apache yang dipasang dari sumber atau lewat XAMPP, nama berkasnya bebas selama dipanggil dengan direktif Include yang sesuai.

Apakah virtual host sama dengan VPS?

Tidak. Virtual host memisahkan website di dalam satu web server yang sama, sementara VPS adalah mesin virtual dengan sistem operasi sendiri. Satu VPS justru biasanya menjalankan banyak virtual host di dalamnya.

Apakah virtual host di RabbitMQ dan host-only adapter sama artinya?

Berbeda sepenuhnya, meskipun namanya mirip. Pada RabbitMQ, virtual host berarti ruang terpisah berisi antrian dan izin aksesnya sendiri. Pada VirtualBox dan VMware, host-only adapter adalah jenis kartu jaringan virtual yang menghubungkan mesin virtual hanya ke komputer induknya. Keduanya tidak berhubungan dengan pemetaan nama domain di web server.

Kesimpulan

Virtual host adalah aturan pemetaan yang menghubungkan sebuah nama domain ke satu folder berkas di dalam server. Header Host yang dikirim browser sejak HTTP/1.1 membuat pemetaan itu mungkin, dan kelangkaan alamat IPv4 membuatnya menjadi keharusan.

Satu hal yang paling berguna diingat: server tidak pernah menolak permintaan yang namanya tidak dikenali, melainkan menyerahkannya ke blok pertama dalam daftar. Karena itu, saat sebuah domain menampilkan website yang salah, yang perlu Anda periksa lebih dulu adalah urutan blok beserta penulisan ServerName, bukan berkas website itu sendiri.

Semoga artikel ini membantu.