Virtual Host #
Virtual hosting adalah kemampuan menjalankan beberapa website berbeda dari satu server fisik. Nginx menangani ini dengan sangat baik — kamu bisa mengelola puluhan website dari satu instalasi Nginx, masing-masing dengan domain, konfigurasi, dan konten yang terpisah sepenuhnya.
Name-Based Virtual Hosting #
Cara yang paling umum: satu IP address, banyak domain. Nginx membedakan website mana yang harus dilayani berdasarkan header Host dari request:
# /etc/nginx/conf.d/example.com.conf
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
access_log /var/log/nginx/example.com-access.log;
error_log /var/log/nginx/example.com-error.log;
location / {
try_files $uri $uri/ =404;
}
}
# /etc/nginx/conf.d/another.com.conf
server {
listen 80;
server_name another.com www.another.com;
root /var/www/another.com;
index index.html;
access_log /var/log/nginx/another.com-access.log;
error_log /var/log/nginx/another.com-error.log;
location / {
try_files $uri $uri/ =404;
}
}
Kedua site berjalan di port 80 yang sama, tapi Nginx mengarahkan request ke direktori yang tepat berdasarkan domain.
Struktur Direktori yang Disarankan #
Untuk server yang mengelola banyak site, struktur direktori yang konsisten membantu manajemen jangka panjang:
/var/www/
├── example.com/
│ ├── html/ # Document root (public files)
│ ├── logs/ # Log per-site (opsional)
│ └── ssl/ # Sertifikat SSL (opsional)
├── another.com/
│ ├── html/
│ └── logs/
└── api.example.com/
└── html/
/etc/nginx/
├── nginx.conf
└── conf.d/
├── example.com.conf
├── another.com.conf
└── api.example.com.conf
Memisahkan log per-site sangat berguna saat debugging — kamu langsung tahu log mana yang perlu dilihat tanpa harus filter dari satu file log besar.
Subdomain sebagai Virtual Host Terpisah #
Subdomain bisa dikonfigurasi sebagai virtual host terpisah dengan konfigurasi yang sepenuhnya berbeda:
# Site utama
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/html;
# ...
}
# Blog di subdomain
server {
listen 80;
server_name blog.example.com;
root /var/www/blog.example.com/html;
# ...
}
# API di subdomain — reverse proxy ke backend
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Virtual Host dengan HTTPS #
Setiap virtual host yang menggunakan HTTPS membutuhkan sertifikat SSL sendiri (atau sertifikat wildcard yang mencakup semua subdomain):
# HTTP → HTTPS redirect untuk semua site
server {
listen 80;
server_name example.com www.example.com blog.example.com;
return 301 https://$host$request_uri;
}
# HTTPS untuk example.com
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
root /var/www/example.com/html;
location / {
try_files $uri $uri/ =404;
}
}
# HTTPS untuk blog.example.com (sertifikat terpisah atau wildcard)
server {
listen 443 ssl;
server_name blog.example.com;
# Bisa pakai sertifikat terpisah
ssl_certificate /etc/letsencrypt/live/blog.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blog.example.com/privkey.pem;
# Atau gunakan wildcard *.example.com
# ssl_certificate /etc/letsencrypt/live/example.com-wildcard/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/example.com-wildcard/privkey.pem;
root /var/www/blog.example.com/html;
location / {
try_files $uri $uri/ =404;
}
}
IP-Based Virtual Hosting #
Jika server memiliki beberapa IP address, kamu bisa memisahkan site berdasarkan IP, bukan domain:
# Site di IP pertama
server {
listen 192.168.1.10:80;
root /var/www/site-a;
# ...
}
# Site di IP kedua
server {
listen 192.168.1.11:80;
root /var/www/site-b;
# ...
}
IP-based virtual hosting jarang digunakan hari ini karena IPv4 terbatas dan sertifikat wildcard/multi-domain (SAN) membuat name-based hosting cukup untuk hampir semua kasus.
Mengelola Banyak Virtual Host: Workflow #
Ketika jumlah site bertambah, workflow yang terstruktur membantu:
# 1. Buat konfigurasi site baru
sudo nano /etc/nginx/conf.d/newsite.com.conf
# 2. Test syntax
sudo nginx -t
# 3. Buat direktori untuk site
sudo mkdir -p /var/www/newsite.com/html
sudo chown -R $USER:www-data /var/www/newsite.com/html
# 4. Upload/buat konten
echo "<h1>New Site</h1>" > /var/www/newsite.com/html/index.html
# 5. Dapatkan sertifikat SSL (jika pakai Let's Encrypt)
sudo certbot --nginx -d newsite.com -d www.newsite.com
# 6. Reload Nginx
sudo nginx -s reload
# Untuk menonaktifkan site (tanpa hapus konfigurasi):
# Ganti ekstensi file sehingga tidak di-include lagi
sudo mv /etc/nginx/conf.d/newsite.com.conf \
/etc/nginx/conf.d/newsite.com.conf.disabled
sudo nginx -s reload
Ringkasan #
- Name-based virtual hosting adalah standar saat ini — satu IP, banyak domain, Nginx bedakan berdasarkan header
Host.- Satu virtual host = satu file konfigurasi di
conf.d/— beri nama file sesuai domain untuk kemudahan manajemen.- Log terpisah per-site (
access_logdanerror_logper server block) memudahkan debugging.- Untuk HTTPS multi-site, setiap domain butuh sertifikat sendiri kecuali menggunakan wildcard certificate yang mencakup semua subdomain.
- Nonaktifkan site dengan mengganti ekstensi file konfigurasi, bukan menghapusnya — lebih mudah diaktifkan kembali.
← Sebelumnya: Serving Static Files Berikutnya: Root & Alias →