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.

Aturan keselamatan
  • Inventarisasi nginx -T sebelum mengedit.
  • Gunakan server_name dan root yang spesifik.
  • Jangan menghapus default site hanya karena tutorial lain menyuruhnya.
  • Selalu jalankan nginx -t sebelum reload.
Diagram dua domain diarahkan Nginx menuju web root berbeda
Host header menjadi pembeda. Kedua situs dapat memakai IP publik yang sama tanpa berbagi file.

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_name hanya 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 -T disimpan 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.log

Alamat 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.

Artikel terkait