Cara Menyiapkan Server Block Nginx untuk Banyak Domain
Cara menjalankan beberapa website di satu VPS dengan server block Nginx, mulai dari struktur folder, server_name, default_server, sampai HTTPS per domain.
Jawaban singkat
Server block adalah blok server di konfigurasi Nginx yang melayani domain tertentu berdasarkan server_name. Buat satu file per domain, beri folder website dan log terpisah, tambahkan satu blok default_server sebagai penampung, lalu pasang HTTPS untuk tiap domain.
Daftar isi
Satu VPS bisa melayani banyak domain sekaligus. Di Nginx, caranya dengan membuat server block terpisah untuk tiap domain, lalu Nginx memilih blok yang cocok berdasarkan nama domain yang diminta browser (header Host).
Kenapa ini penting? Tanpa pemisahan yang rapi, satu salah ketik bisa membuat domain A menampilkan isi domain B, atau domain yang belum diatur malah membuka website lain. Dengan pola yang konsisten, menambah domain baru cukup beberapa menit dan risikonya kecil.
Bagaimana Nginx memilih server block?
Untuk setiap request, Nginx pertama-tama melihat alamat dan port tujuan (listen), lalu mencocokkan header Host dengan server_name di blok-blok yang mendengarkan port itu. Menurut dokumentasi resmi nginx.org, urutan pencocokannya:
- Nama persis, misalnya
tokoku.example. - Wildcard terpanjang di depan, misalnya
*.tokoku.example. - Wildcard terpanjang di belakang, misalnya
mail.*. - Regular expression pertama yang cocok, sesuai urutan di konfigurasi.
Kalau tidak ada yang cocok sama sekali, request jatuh ke default server untuk port tersebut. Bila tidak ada yang ditandai default_server, Nginx memakai blok pertama yang ditemukan untuk port itu. Ini sumber kejutan paling umum: domain asing yang diarahkan ke IP-mu tiba-tiba menampilkan website pertama.
Struktur folder yang rapi
Di Ubuntu dan Debian, paket Nginx memakai pola dua folder:
/etc/nginx/sites-available/berisi semua file konfigurasi domain./etc/nginx/sites-enabled/berisi symlink ke file yang aktif.
Di AlmaLinux, Rocky, dan distro keluarga RHEL, polanya biasanya satu folder /etc/nginx/conf.d/ dengan file berakhiran .conf. Prinsip di bawah tetap sama, hanya lokasinya berbeda.
Untuk isi website, beri setiap domain folder dan pemilik sendiri:
sudo mkdir -p /var/www/tokoku.example/public
sudo mkdir -p /var/www/blogku.example/public
sudo chown -R $USER:www-data /var/www/tokoku.example /var/www/blogku.example
Membuat server block untuk domain pertama
Buat file /etc/nginx/sites-available/tokoku.example:
server {
listen 80;
listen [::]:80;
server_name tokoku.example www.tokoku.example;
root /var/www/tokoku.example/public;
index index.html index.php;
access_log /var/log/nginx/tokoku.example.access.log;
error_log /var/log/nginx/tokoku.example.error.log;
location / {
try_files $uri $uri/ =404;
}
}
Untuk domain kedua, salin file ini menjadi blogku.example, lalu ganti server_name, root, dan nama file log. Log terpisah sangat membantu saat melacak error, karena kamu tidak perlu memilah log campuran.
Kalau website memakai PHP, tambahkan blok location ~ \.php$ yang mengarah ke socket PHP-FPM. Setiap domain bahkan bisa memakai versi PHP berbeda, caranya ada di panduan menjalankan banyak versi PHP di satu server.
Mengaktifkan dan menguji konfigurasi
sudo ln -s /etc/nginx/sites-available/tokoku.example /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/blogku.example /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Di distro keluarga RHEL yang tidak memakai sites-enabled, cukup simpan file sebagai /etc/nginx/conf.d/tokoku.example.conf, karena semua file .conf di folder itu otomatis dimuat.
Biasakan selalu menjalankan nginx -t sebelum reload. Bila ada kesalahan sintaks, Nginx menolak konfigurasi baru dan website yang sedang berjalan tidak terganggu. Pakai reload, bukan restart, agar koneksi yang sedang berjalan tidak diputus.
Sebelum DNS diarahkan, kamu bisa menguji dari laptop dengan curl -H "Host: tokoku.example" http://IP-SERVER/ atau menambahkan baris sementara di file hosts.
Apa gunanya blok default_server?
Blok penampung mencegah domain atau IP yang tidak dikenal membuka website milikmu. Buat /etc/nginx/sites-available/00-default:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}
Kode 444 adalah kode khusus Nginx yang menutup koneksi tanpa mengirim respons apa pun. Nama _ tidak punya arti istimewa, hanya nama yang tidak mungkin cocok dengan domain sungguhan. Di Ubuntu, file bawaan default di sites-enabled sudah memakai default_server. Hapus symlink-nya atau ubah file itu, karena satu port hanya boleh punya satu default_server.
Untuk port 443, blok penampung juga perlu sertifikat. Pilihan yang umum adalah ssl_reject_handshake on; (tersedia sejak Nginx 1.19.4) sehingga tidak perlu sertifikat palsu.
Bagaimana memasang HTTPS untuk banyak domain?
Setelah DNS setiap domain mengarah ke IP server, Certbot dengan plugin Nginx bisa membaca server_name di tiap blok dan memasang sertifikat sekaligus:
sudo certbot --nginx -d tokoku.example -d www.tokoku.example
sudo certbot --nginx -d blogku.example -d www.blogku.example
Memisahkan perintah per website membuat setiap domain punya sertifikat sendiri, jadi masalah di satu domain tidak menghambat perpanjangan domain lain. Langkah lengkapnya ada di panduan pasang SSL Let's Encrypt dengan Certbot. Setelah semua domain berjalan, lanjutkan dengan hardening Nginx untuk server produksi.
| Masalah | Penyebab umum | Perbaikan |
|---|---|---|
| Domain B menampilkan isi domain A | server_name salah ketik atau blok belum diaktifkan | Cek symlink dan ejaan, jalankan nginx -t |
| Domain asing membuka websitemu | Belum ada default_server penampung | Tambahkan blok return 444 |
Error duplicate default server | Dua blok memakai default_server di port sama | Sisakan satu |
Peringatan conflicting server name | Nama domain yang sama muncul di dua blok | Hapus salah satu |
| 403 Forbidden | Folder tidak terbaca pengguna Nginx atau tidak ada file index | Periksa izin dan index |
Pertanyaan yang sering diajukan
Berapa banyak domain yang bisa dilayani satu Nginx?
Nginx tidak membatasi jumlah server block secara praktis. Batas sebenarnya ada di sumber daya server: CPU, RAM, dan disk untuk aplikasi di tiap domain.
Apakah server block sama dengan virtual host di Apache?
Konsepnya sama, yaitu satu server melayani banyak domain berdasarkan nama. Istilah server block khas Nginx, sedangkan Apache menyebutnya VirtualHost.
Bagaimana menonaktifkan satu domain sementara?
Hapus symlink-nya di sites-enabled, lalu nginx -t dan reload. File aslinya di sites-available tetap aman untuk diaktifkan lagi.


