Virtual Host

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_log dan error_log per 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 →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact