Deploy Nginx di Ubuntu Server
Memasang Nginx, menyajikan halaman web pertama, lalu memahami konfigurasi dan log-nya. Tiap perintah dijelaskan fungsinya.
Gambaran besar
Nginx (dibaca "engine-x") adalah web server: program yang menerima permintaan dari browser lalu mengirimkan file website sebagai jawabannya. Nginx juga bisa berperan sebagai reverse proxy dan load balancer, tapi di halaman ini kita fokus ke fungsi dasarnya.
http://172.16.6.200/var/www/htmlNginx hanya "pelayan". Ia tidak menyimpan website, ia mengambil file dari folder yang ditunjuk konfigurasi.
Tiga hal yang perlu kamu pahami dari awal sampai akhir:
- File website ditaruh di sebuah folder.
- Konfigurasi memberi tahu Nginx: "untuk alamat ini, sajikan folder itu".
- Setelah konfigurasi diubah: tes (
nginx -t), lalu reload.
Persiapan
Kebutuhan VM (Proxmox)
| Komponen | Kebutuhan |
|---|---|
| CPU | 1 core sudah cukup |
| RAM | 1 GB sudah cukup |
| Disk | 10 GB atau lebih |
| OS | Ubuntu Server 22.04 atau 24.04 |
Yang perlu disiapkan
- Network VM memakai bridge
vmbr0(Hardware → Network Device) agar VM dapat IP di jaringan yang sama dengan laptopmu. - Bisa login ke VM lewat Console Proxmox atau SSH, dan user punya hak
sudo. - IP yang tetap. Di halaman ini contohnya
172.16.6.200. Ganti dengan IP VM-mu. - Snapshot Proxmox sebelum mulai (VM → Snapshot → Take Snapshot).
http://... dibuka di browser.Cek IP dan koneksi
Pastikan VM punya IP yang benar dan bisa terhubung ke internet untuk mengunduh paket.
ip -br a
ping -c 3 google.comFungsi tiap perintah
| Perintah | Artinya |
|---|---|
ip -br a | Menampilkan interface jaringan dan IP-nya dalam satu baris ringkas (-br = brief, a = address). Catat IP di baris ens18 atau sejenisnya. |
ping -c 3 google.com | Kirim 3 paket tes ke google.com (-c 3 = count 3). Kalau dibalas, internet VM jalan. |
Hasil yang benar: ada IP seperti 172.16.6.200/24 dan ping menampilkan 0% packet loss.
Update sistem
Memperbarui daftar dan versi paket Ubuntu sebelum memasang program baru.
sudo apt update && sudo apt upgrade -yFungsi tiap bagian
| Bagian | Artinya |
|---|---|
sudo | Jalankan dengan hak administrator (root). |
apt update | Ambil daftar terbaru paket yang tersedia. Belum menginstal apa pun. |
&& | "Kalau perintah sebelumnya berhasil, lanjut ke perintah berikutnya." |
apt upgrade -y | Perbarui semua paket terpasang. -y = otomatis jawab "ya". |
Hasil yang benar: selesai tanpa tulisan E: (error). Kalau kernel ikut diperbarui, jalankan sudo reboot lalu login lagi.
Install Nginx
Memasang program Nginx dari repositori resmi Ubuntu.
sudo apt install nginx -y
nginx -vFungsi tiap perintah
| Perintah | Artinya |
|---|---|
apt install nginx -y | Unduh dan pasang Nginx beserta pendukungnya. Nginx langsung dijalankan otomatis setelah terpasang. |
nginx -v | Menampilkan versi Nginx untuk memastikan terpasang. |
Hasil yang benar: nginx -v menampilkan sesuatu seperti nginx version: nginx/1.x.x (Ubuntu).
Cek service
Pastikan Nginx berjalan dan akan menyala sendiri setiap VM dihidupkan.
sudo systemctl status nginx --no-pager
sudo systemctl enable nginxFungsi tiap perintah
| Perintah | Artinya |
|---|---|
systemctl | Alat untuk mengatur layanan (service) di Ubuntu. |
status nginx | Tampilkan status layanan Nginx dan beberapa baris log terakhirnya. |
--no-pager | Tampilkan semuanya langsung, tidak masuk mode baca per halaman. |
enable nginx | Nginx otomatis menyala saat boot. Biasanya sudah aktif otomatis, perintah ini menjamin. |
Hasil yang benar: ada tulisan hijau active (running). Kalau failed, lihat bagian Kalau error.
Buka firewall
Izinkan orang mengakses web lewat port 80. Lewati langkah ini jika firewall (ufw) tidak kamu pakai.
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx HTTP'
sudo ufw enable
sudo ufw statusFungsi tiap perintah
| Perintah | Artinya |
|---|---|
ufw allow OpenSSH | Izinkan SSH (port 22). Wajib dijalankan sebelum enable, kalau tidak koneksi SSH-mu bisa terputus. |
ufw allow 'Nginx HTTP' | Izinkan port 80 lewat profil bawaan Nginx. Profil lain: 'Nginx HTTPS' (port 443) dan 'Nginx Full' (80 dan 443). |
ufw enable | Aktifkan firewall. Ketik y jika ditanya. |
ufw status | Tampilkan aturan yang sedang aktif. |
Hasil yang benar: Status: active, dengan OpenSSH dan Nginx HTTP berstatus ALLOW.
Tes di browser
Membuktikan Nginx benar-benar melayani pengunjung.
Tes cepat dari dalam VM:
curl -I http://localhost| Bagian | Artinya |
|---|---|
curl | Program untuk membuka alamat web lewat terminal. |
-I | Hanya tampilkan header jawaban (bukan seluruh isi halaman). |
http://localhost | Alamat komputer ini sendiri. |
Lalu dari browser di laptop (satu jaringan dengan Proxmox), buka:
http://172.16.6.200Hasil yang benar: curl menampilkan HTTP/1.1 200 OK, dan browser menampilkan halaman Welcome to nginx!.
Edit halaman default
Cara paling mudah membuat website sendiri: ubah file di folder bawaan Nginx.
ls -la /var/www/html/
sudo nano /var/www/html/index.htmlDi editor nano, hapus isi lama (tekan Ctrl+K berulang untuk menghapus baris demi baris), lalu tempel isi ini:
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="utf-8">
<title>Websiteku</title>
</head>
<body>
<h1>Halo dari Proxmox!</h1>
<p>Server ini jalan pakai Nginx.</p>
</body>
</html>Simpan dengan Ctrl+O, Enter, lalu keluar dengan Ctrl+X.
Fungsi tiap bagian
| Bagian | Artinya |
|---|---|
ls -la /var/www/html/ | Lihat isi folder website. -l = detail, -a = termasuk file tersembunyi. |
nano | Editor teks sederhana di terminal. |
/var/www/html/index.html | index.html adalah halaman yang tampil otomatis saat orang membuka alamat tanpa nama file. |
Hasil yang benar: refresh browser (Ctrl+F5), tulisan berubah menjadi "Halo dari Proxmox!". Tidak perlu reload Nginx, karena kamu hanya mengubah isi website, bukan konfigurasi.
Nama file = alamat halaman. File tentang.html di folder itu dibuka lewat http://172.16.6.200/tentang.html. .html di alamat wajib ditulis, kecuali kamu mengatur konfigurasi khusus.
Buat server block sendiri
Cara yang lebih rapi: folder website dan konfigurasi milikmu sendiri, terpisah dari bawaan. Di sinilah kamu belajar membaca konfigurasi Nginx.
A. Buat folder dan salin halaman yang sudah ada
sudo mkdir -p /var/www/belajar
sudo cp -n /var/www/html/*.html /var/www/belajar/
sudo chown -R www-data:www-data /var/www/belajar| Perintah | Artinya |
|---|---|
mkdir -p /var/www/belajar | Buat folder baru. -p = tidak error kalau sudah ada. |
cp -n ...*.html ... | Salin semua file .html dari folder lama (termasuk index.html dan wazuh.html kalau ada). -n = jangan timpa file yang sudah ada. |
chown -R www-data:www-data | Serahkan kepemilikan folder ke www-data, user yang dipakai Nginx. -R = termasuk semua isinya. |
B. Tulis konfigurasi
sudo nano /etc/nginx/sites-available/belajarIsi dengan (ganti IP dengan IP VM-mu):
server {
listen 80;
server_name 172.16.6.200;
root /var/www/belajar;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}Arti tiap baris konfigurasi
| Baris | Artinya |
|---|---|
server { ... } | Satu blok = satu website. |
listen 80; | Dengarkan port 80 (port HTTP standar). |
server_name 172.16.6.200; | Blok ini melayani permintaan yang ditujukan ke alamat ini. Nanti bisa diganti nama domain. |
root /var/www/belajar; | Folder tempat file website berada. |
index index.html; | Kalau alamat tanpa nama file, tampilkan index.html. |
location / { ... } | Aturan untuk semua alamat yang diawali / (yaitu semuanya). |
try_files $uri $uri/ =404; | Cari file yang diminta, lalu foldernya. Kalau tidak ada, tampilkan error 404. |
C. Aktifkan, tes, lalu reload
sudo ln -s /etc/nginx/sites-available/belajar /etc/nginx/sites-enabled/belajar
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx| Perintah | Artinya |
|---|---|
ln -s A B | Buat shortcut (symlink) ke file A di lokasi B. Konfigurasi hanya aktif kalau shortcut-nya ada di sites-enabled. |
rm .../sites-enabled/default | Matikan situs bawaan supaya tidak bentrok. Ini hanya menghapus shortcut, file aslinya di sites-available tetap aman. |
nginx -t | Tes: apakah konfigurasi yang kamu tulis benar? Selalu jalankan sebelum reload. |
systemctl reload nginx | Terapkan konfigurasi baru tanpa memutus koneksi pengunjung yang sedang aktif. |
/var/www/belajar, bukan /var/www/html lagi. Untuk halaman baru (misalnya wazuh.html), taruh di folder belajar.Hasil yang benar: nginx -t menampilkan syntax is ok dan test is successful. Browser tetap menampilkan websitemu di http://172.16.6.200.
Baca log
Log adalah cara utama mencari tahu siapa yang mengakses dan apa yang salah.
sudo tail -f /var/log/nginx/access.log
sudo tail -n 30 /var/log/nginx/error.log| Bagian | Artinya |
|---|---|
tail -f | Tampilkan akhir file dan terus mengikuti baris baru secara langsung. Keluar dengan Ctrl+C. |
tail -n 30 | Tampilkan 30 baris terakhir saja. |
access.log | Catatan setiap permintaan yang masuk. |
error.log | Catatan kesalahan (konfigurasi salah, file tidak ditemukan, izin ditolak). |
Jalankan perintah pertama, lalu buka atau refresh websitemu di browser. Satu baris baru muncul, kira-kira seperti ini:
172.16.6.10 - - [20/Sep/2026:10:15:32 +0700] "GET /index.html HTTP/1.1" 200 156 "-" "Mozilla/5.0 ..."| Bagian | Artinya |
|---|---|
172.16.6.10 | IP pengunjung (laptopmu). |
[20/Sep/2026:10:15:32 +0700] | Waktu permintaan. |
"GET /index.html HTTP/1.1" | Yang diminta: metode GET, halaman /index.html. |
200 | Kode status jawaban (lihat tabel di bawah). |
156 | Ukuran jawaban dalam byte. |
"Mozilla/5.0 ..." | Jenis browser pengunjung. |
Kode status yang sering muncul
| Kode | Artinya |
|---|---|
| 200 | Berhasil. |
| 301 / 302 | Dialihkan ke alamat lain. |
| 403 | Ditolak: izin file atau folder salah, atau tidak ada file index.html. |
| 404 | File tidak ditemukan (nama salah atau folder salah). |
| 502 | Nginx tidak bisa menghubungi aplikasi di belakangnya (pada mode reverse proxy). |
Bonus: kunci website dengan password
Untuk membuat websitemu benar-benar meminta login. Nginx bisa melakukannya lewat Basic Auth. Butuh langkah 8 sudah selesai.
A. Buat file password
sudo apt install apache2-utils -y
sudo htpasswd -c /etc/nginx/.htpasswd admin| Bagian | Artinya |
|---|---|
apt install apache2-utils | Memasang alat htpasswd (dipakai untuk membuat password terenkripsi). |
htpasswd -c ... | Buat file password baru. -c = create. Untuk menambah user berikutnya, jalankan tanpa -c agar file tidak tertimpa. |
/etc/nginx/.htpasswd | Lokasi file. Titik di depan membuatnya file tersembunyi. |
admin | Nama user. Kamu akan diminta mengetik password dua kali. |
B. Aktifkan di konfigurasi
sudo nano /etc/nginx/sites-available/belajarUbah blok location / menjadi:
location / {
auth_basic "Area terbatas";
auth_basic_user_file /etc/nginx/.htpasswd;
try_files $uri $uri/ =404;
}| Baris baru | Artinya |
|---|---|
auth_basic "Area terbatas"; | Aktifkan kotak login. Teks di dalam tanda kutip tampil sebagai judul kotak login. |
auth_basic_user_file ...; | Lokasi file daftar user dan password tadi. |
C. Tes dan reload
sudo nginx -t && sudo systemctl reload nginxDi sini && membuat reload hanya berjalan kalau tes konfigurasi lolos.
Hasil yang benar: membuka http://172.16.6.200 memunculkan kotak login dari browser. Username admin dan password yang kamu buat membuka websitenya. Password salah menghasilkan status 401 di access log.
http biasa, username dan password dikirim tanpa enkripsi kuat, jadi bisa dibaca orang yang menyadap jaringan. Untuk latihan di jaringan lokal tidak masalah. Untuk akses dari internet, wajib pakai HTTPS. Ini juga bukan pengganti login aplikasi sungguhan (dengan database dan backend), hanya pintu berkunci untuk seluruh website.Perintah harian
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx
sudo nginx -t
sudo nginx -T | less| Perintah | Kapan dipakai |
|---|---|
start | Menyalakan Nginx yang sedang mati. |
stop | Mematikan Nginx. Website tidak bisa diakses. |
restart | Matikan lalu nyalakan lagi. Koneksi aktif terputus sebentar. |
reload | Terapkan konfigurasi baru tanpa putus koneksi. Pilihan utama setelah mengubah konfigurasi. |
nginx -t | Tes konfigurasi. Jalankan sebelum reload. |
nginx -T | less | Tampilkan seluruh konfigurasi aktif yang dibaca Nginx, lengkap dengan nama file asalnya. | menyalurkan hasilnya ke less supaya bisa dibaca per halaman (keluar dengan q). Ini cara terbaik melihat "apa saja yang sedang aktif". |
Lokasi file penting
| Lokasi | Isi |
|---|---|
/etc/nginx/nginx.conf | Konfigurasi utama. Di dalamnya ada perintah include yang memuat isi sites-enabled. |
/etc/nginx/sites-available/ | Semua konfigurasi website (aktif maupun tidak). |
/etc/nginx/sites-enabled/ | Konfigurasi yang aktif, berupa shortcut ke sites-available. |
/etc/nginx/conf.d/ | Alternatif tempat konfigurasi tambahan (semua file .conf di sini otomatis dibaca). |
/var/www/ | Folder file website (html bawaan, belajar milikmu). |
/var/log/nginx/ | Log akses dan error. |
/usr/sbin/nginx | Program Nginx itu sendiri. |
Alur pembacaan Nginx: nginx.conf → include sites-enabled/* → blok server milikmu → folder root → file website.
Kalau error
| Gejala | Penyebab dan solusi |
|---|---|
nginx -t menampilkan error | Baca pesannya, biasanya menyebut nama file dan nomor baris. Paling sering: lupa titik koma ; di akhir baris atau kurung } tidak lengkap. Perbaiki lalu tes ulang. Jangan reload sebelum lolos. |
| Browser: halaman tidak bisa dibuka | Cek systemctl status nginx (harus active), IP benar, dan port 80 dibuka di ufw. Pastikan laptop satu jaringan dengan VM. |
| 403 Forbidden | Tidak ada index.html di folder root, atau izin folder salah. Coba sudo chown -R www-data:www-data /var/www/belajar. |
| 404 Not Found | Nama file salah atau ada di folder lain. Cek dengan ls /var/www/belajar/ dan pastikan root di konfigurasi menunjuk folder yang benar. |
| Perubahan file tidak terlihat | Cache browser. Tekan Ctrl+F5. |
| Perubahan konfigurasi tidak berlaku | Lupa reload, atau shortcut belum ada di sites-enabled (cek ls -la /etc/nginx/sites-enabled/). |
| Nginx gagal start: address already in use | Port 80 sudah dipakai program lain. Cek dengan sudo ss -tlnp | grep :80. |
Untuk penyebab detail, selalu lihat log error:
sudo tail -n 30 /var/log/nginx/error.logHapus Nginx (kalau mau mengulang)
Cara termudah adalah rollback snapshot di Proxmox. Alternatif lewat terminal:
sudo systemctl stop nginx
sudo apt purge nginx nginx-common -y
sudo apt autoremove -y| Perintah | Artinya |
|---|---|
systemctl stop nginx | Matikan Nginx dulu. |
apt purge nginx nginx-common | Hapus program beserta file konfigurasinya di /etc/nginx. (remove biasa akan menyisakan konfigurasi.) |
apt autoremove | Bersihkan paket pendukung yang tidak terpakai lagi. |
Folder website di /var/www tidak ikut terhapus, jadi isi websitemu aman.