Konfigurasi Nginx Multi-Domain Tanpa Mengganggu Situs Lama
Menambahkan virtual host baru pada VPS yang sudah melayani aplikasi lain dengan backup, server_name spesifik, dan pengujian aman.
VPS NgodingSantai sudah melayani aplikasi lain ketika domain baru hendak dipasang. Sasaran konfigurasi bukan sekadar membuat Nginx hidup, melainkan menambahkan satu virtual host tanpa mengambil alih domain lama, web root lama, atau sertifikat yang sudah ada. Studi kasus ini menunjukkan pemeriksaan dan batas perubahan yang digunakan.
- Inventarisasi
nginx -Tsebelum mengedit. - Gunakan
server_namedanrootyang spesifik. - Jangan menghapus default site hanya karena tutorial lain menyuruhnya.
- Selalu jalankan
nginx -tsebelum reload.
Bedakan server block dan proses Nginx
Satu proses Nginx membaca banyak blok server. Setiap blok dapat mempunyai pasangan listen, server_name, dan root berbeda. Saat permintaan datang, Nginx memilih alamat dan port lalu mencocokkan Host. Jika tidak ada kecocokan, default server untuk port tersebut digunakan. Inilah alasan konfigurasi default perlu dipahami sebelum dihapus.
sudo nginx -T 2>&1 | less
sudo grep -RIn "listen|server_name|root" /etc/nginx/sites-enabled /etc/nginx/conf.d
sudo ss -ltnp | grep -E ':80|:443'
Gunakan file khusus domain
Konfigurasi NgodingSantai disimpan sebagai /etc/nginx/sites-available/ozancicak.biz.id dan diaktifkan melalui symlink. Nama file bukan bagian dari routing; ia hanya membantu administrator mengenali pemilik aturan. Routing ditentukan oleh isi server_name.
server {
listen 80;
listen [::]:80;
server_name ozancicak.biz.id www.ozancicak.biz.id;
root /var/www/ozancicak.biz.id;
index index.html;
charset utf-8;
location / {
try_files $uri $uri/ =404;
}
}
try_files sengaja mengembalikan 404 ketika file tidak ada. Mengarahkan semua path ke index.html cocok untuk sebagian single-page application, tetapi pada blog statis akan membuat URL salah terlihat sebagai halaman valid dan menyulitkan crawler memahami struktur.
Uji routing sebelum DNS
Menunggu propagasi DNS untuk menemukan salah konfigurasi adalah proses lambat. Permintaan lokal dengan Host header menguji pemilihan virtual host langsung pada Nginx.
curl -sS -D - -o /dev/null -H 'Host: ozancicak.biz.id' http://127.0.0.1/
curl -sS -H 'Host: ozancicak.biz.id' http://127.0.0.1/ | head
Periksa status, Content-Type, dan beberapa baris isi. Status 200 dengan isi aplikasi lama menunjukkan permintaan jatuh ke blok yang salah. Status 404 bisa berarti root salah atau file belum diclone.
Atur cache sesuai jenis file
HTML NgodingSantai diperiksa ulang agar pembaruan artikel cepat terlihat, sedangkan CSS, JavaScript, font, dan gambar disimpan sementara. Karena nama aset belum memakai hash konten, cache dibuat tujuh hari, bukan setahun dengan immutable. Jika kemudian pipeline menambahkan nama berversi, kebijakan dapat diperpanjang.
location ~* .html$ {
expires -1;
try_files $uri =404;
}
location ~* .(?:css|js|svg|png|jpe?g|webp|woff2?)$ {
expires 7d;
try_files $uri =404;
}
Lindungi file operasional
Repository berada langsung di web root sehingga aturan eksplisit digunakan untuk folder yang bukan bagian situs. Perlindungan ini bukan pengganti pengelolaan rahasia—rahasia tetap tidak boleh masuk Git—tetapi mencegah README, konfigurasi deployment, script internal, dan dotfile tersaji karena salah URL.
location ^~ /deploy/ { return 404; }
location ^~ /scripts/ { return 404; }
location = /README.md { return 404; }
location ~ /.(?!well-known).* { deny all; }
Tambahkan header yang dapat dijelaskan
X-Content-Type-Options: nosniff, X-Frame-Options: SAMEORIGIN, dan Referrer-Policy digunakan karena sesuai fungsi situs. Content Security Policy belum dipasang secara terburu-buru karena halaman masih memuat beberapa library dan font eksternal; CSP yang salah dapat mematikan aset atau mendorong wildcard yang tidak berguna.
Aktifkan dengan perubahan atomik
sudo ln -s /etc/nginx/sites-available/ozancicak.biz.id /etc/nginx/sites-enabled/ozancicak.biz.id
sudo nginx -t
sudo systemctl reload nginx
sudo systemctl status nginx --no-pager
Reload berbeda dari restart: Nginx memuat konfigurasi baru tanpa sengaja memutus seluruh layanan. Bila tes sintaks gagal, jangan reload. Baca nama file dan nomor baris, koreksi file yang dimaksud, lalu ulangi tes.
Checklist setelah HTTPS
server_namehanya mencantumkan domain yang dimiliki blok tersebut.- Sertifikat NgodingSantai tidak mengganti sertifikat aplikasi lama.
- Permintaan dengan kedua domain menunjukkan judul dan root yang berbeda.
- 404, HTML, SVG, CSS, dan JavaScript mempunyai status serta Content-Type yang benar.
nginx -Tdisimpan sebagai bukti konfigurasi efektif setelah perubahan.
Referensi primer
Periksa log tanpa mencampur dua situs
Setiap virtual host dapat diberi access log dan error log khusus. Pemisahan memudahkan memastikan permintaan domain baru masuk ke blok yang benar tanpa menyaring seluruh trafik aplikasi lama. Log tidak dipublikasikan dan rotasinya tetap mengikuti konfigurasi sistem.
access_log /var/log/nginx/ozancicak.access.log;
error_log /var/log/nginx/ozancicak.error.log warn;
sudo tail -f /var/log/nginx/ozancicak.access.logAlamat IP dan user-agent dalam log dapat menjadi data pribadi atau pengenal. Masa simpan, akses administrator, dan penggunaan analytics perlu dibatasi sesuai kebutuhan serta kebijakan privasi.
Rollback satu virtual host
Jika konfigurasi baru menyebabkan masalah, hanya symlink ozancicak.biz.id yang dinonaktifkan. Sesudah itu nginx -t harus lulus sebelum reload. Backup seluruh folder Nginx tetap tersedia, tetapi memulihkan semua konfigurasi adalah pilihan terakhir karena dapat mengembalikan perubahan sah milik aplikasi lain.