Cara Install dan Konfigurasi Nginx di Ubuntu

Install dan Konfigurasi Nginx di Ubuntu

Gue pertama kali pasang Nginx di server Ubuntu 24.04 waktu ngerjain freelance project awal 2026. Semua berjalan lancar sampai gue dengan percaya diri nulis satu aturan firewall yang salah. Hasilnya? Server terkunci selama 3 jam dan klien gue kirim pesan WhatsApp setiap 20 menit nanyain “Mas, kok websitenya masih mati?”

Artikel ini gue tulis buat kamu yang baru pertama kali setup web server di Ubuntu, biar tidak jatuh ke lubang yang sama. Bukan hanya cara pasang Nginx, tapi juga kenapa tiap langkahnya perlu dilakukan.

Apa Itu Nginx dan Kenapa Tidak Sekadar “Software Web Server”?

Bayangkan server kamu seperti gedung perkantoran. Ada resepsionis di depan yang tugasnya nerima semua tamu yang datang, lalu mengarahkan mereka ke lantai atau ruangan yang tepat.

Nginx adalah resepsionis itu.

Tapi bukan resepsionis biasa yang cuma bisa ngurus satu tamu sekaligus. Nginx dirancang dengan arsitektur event-driven dan non-blocking, artinya dia bisa nangani ribuan koneksi simultan tanpa harus spawn proses baru untuk setiap koneksi. Beda dengan Apache yang secara default membuat satu thread per koneksi seperti resepsionis yang manggil satpam baru setiap kali ada tamu masuk.

Waktu gue migrasi dari Apache ke Nginx di salah satu project e-commerce, perbedaannya langsung terasa. Penggunaan RAM turun drastis dan response time di peak traffic jauh lebih stabil. Bukan sekadar angka di benchmark, tapi bisa dirasakan langsung di monitoring.

Nginx juga bukan cuma web server. Dia bisa jadi:

  • Reverse proxy — misalnya kamu punya aplikasi Express.js di port 3000, Nginx yang jadi “wajah publik”-nya di port 80/443
  • Load balancer untuk distribusi traffic ke beberapa instance aplikasi
  • Static file server yang sangat efisien untuk aset seperti gambar, CSS, dan JS

Sebelum Mulai: Apa yang Kamu Butuhkan?

  • Ubuntu 24.04 LTS (guide ini juga berlaku untuk 22.04)
  • Akses SSH ke server atau terminal langsung
  • User dengan hak sudo
  • Koneksi internet aktif di server

Langkah 1: Update Package Index

Sebelum install apa pun, selalu update daftar package terlebih dahulu.

# Sinkronisasi database package lokal dengan repository Ubuntu
sudo apt update

Kenapa perlu dilakukan? apt update tidak meng-upgrade apapun, dia hanya menyegarkan metadata daftar package. Tanpa ini, Ubuntu bisa saja menginstall versi lama Nginx karena masih membaca cache lama dari database lokal.

💡 Tips dari Pengalaman: Jangan gabungkan apt update dan apt install di satu baris tanpa yakin dulu update-nya bersih. Kalau ada error saat update (misalnya repository tidak bisa dijangkau), proses install tetap jalan tapi pakai data lama.

Langkah 2: Install Nginx

# Install Nginx dari repository resmi Ubuntu
sudo apt install nginx -y

Kenapa flag -y? Ini menjawab “yes” otomatis untuk konfirmasi instalasi. Kalau kamu jalankan via script atau remote session, tanpa flag ini proses akan berhenti nunggu input.

Di balik layar, apt mengunduh package Nginx beserta dependency-nya, mengekstrak file, dan mendaftarkan Nginx sebagai systemd service. Artinya Nginx otomatis terdaftar di sistem, tapi belum tentu langsung jalan.

⚠️ Perhatian: Kalau muncul error E: Unable to locate package nginx, kemungkinan besar apt update di langkah sebelumnya tidak berhasil sempurna. Jalankan ulang sudo apt update dan perhatikan output errornya.

Langkah 3: Aktifkan dan Jalankan Nginx

# Jalankan Nginx sekarang
sudo systemctl start nginx

# Aktifkan Nginx agar otomatis start setiap server reboot
sudo systemctl enable nginx

Kenapa dua perintah terpisah? start hanya menjalankan Nginx untuk sesi sekarang. Kalau server reboot tanpa enable, Nginx tidak akan otomatis aktif dan website kamu mati sampai ada yang manual login dan jalanin lagi. Gue pernah lupa enable di server production. Klien pagi-pagi telepon nanya kenapa websitenya hilang setelah VPS di-restart.

💡 Tips dari Pengalaman: Setelah instalasi fresh, cek apakah Nginx sudah otomatis start dengan sudo systemctl is-enabled nginx. Outputnya harus enabled, bukan disabled.

Langkah 4: Konfigurasi Firewall (Bagian yang Pernah Bikin Gue Panik)

Ini bagian paling kritis dan paling sering disepelekan.

# Lihat dulu profil firewall yang tersedia untuk Nginx
sudo ufw app list

Output yang kamu lihat:

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Ada tiga pilihan untuk Nginx:

  • Nginx HTTP: Buka port 80 saja
  • Nginx HTTPS: Buka port 443 saja
  • Nginx Full: Buka port 80 dan 443 sekaligus
# Izinkan traffic HTTP dan HTTPS
sudo ufw allow 'Nginx Full'

# Pastikan OpenSSH tetap diizinkan (INI YANG DULU LUPA GUE)
sudo ufw allow OpenSSH

# Aktifkan firewall
sudo ufw enable

# Verifikasi status
sudo ufw status

⚠️ Perhatian KRITIS: Pastikan OpenSSH sudah di-allow SEBELUM kamu enable UFW. Kalau tidak, kamu akan kehilangan akses SSH ke server dan harus akses lewat console panel VPS (kalau ada) atau menghubungi support hosting. Gue belajar ini dengan cara yang tidak menyenangkan — 3 jam duduk di depan laptop sambil keringat dingin buka panel darurat VPS.

💡 Tips dari Pengalaman: Setelah ufw enable, langsung buka terminal baru dan coba SSH ke server dari sana sebelum menutup sesi yang sedang aktif. Kalau berhasil, berarti aturan firewall benar.

Langkah 5: Buat Konfigurasi Server Block

Ini setara dengan “virtual host” kalau kamu pernah dengar istilah itu di Apache. Satu server Nginx bisa melayani banyak domain sekaligus, masing-masing dengan konfigurasi terpisah.

Misalnya kamu deploy aplikasi Express.js di port 3000 dan mau ekspos ke internet via domain app.contoh.com:

# Buat file konfigurasi baru
sudo nano /etc/nginx/sites-available/app.contoh.com

Isi dengan konfigurasi berikut:

server {
    listen 80;
    server_name app.contoh.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Kemudian aktifkan konfigurasi ini:

# Buat symlink dari sites-available ke sites-enabled
sudo ln -s /etc/nginx/sites-available/app.contoh.com /etc/nginx/sites-enabled/

# Test apakah konfigurasi valid secara sintaks
sudo nginx -t

# Reload Nginx untuk menerapkan perubahan
sudo systemctl reload nginx

Kenapa pakai reload bukan restart? reload membuat Nginx memuat ulang konfigurasi tanpa mematikan koneksi yang sedang aktif. restart akan memutus semua koneksi yang sedang berjalan. Di server production dengan traffic aktif, ini perbedaan yang sangat berarti.

💡 Tips dari Pengalaman: Selalu jalankan sudo nginx -t sebelum reload. Ini akan menangkap error sintaks sebelum merusak server yang sedang berjalan. Gue hafal output nginx: the configuration file /etc/nginx/nginx.conf syntax is ok di luar kepala karena sudah ribuan kali melihatnya.

Bagaimana Cara Tahu Nginx Sudah Berhasil Jalan?

Ada beberapa cara verifikasi yang bisa kamu lakukan, tidak hanya satu.

Cara 1: Cek Status Service

sudo systemctl status nginx

Cari baris Active: active (running). Kalau masih inactive, berarti Nginx belum jalan.

Cara 2: Cek via Browser

Buka http://IP_SERVER_KAMU di browser. Kalau muncul halaman “Welcome to nginx!”, instalasi berhasil.

Cara 3: Cek Port yang Terbuka (Jarang Disebutkan Tutorial Lain)

sudo ss -tlnp | grep nginx

Output yang diharapkan:

LISTEN 0  511  0.0.0.0:80  0.0.0.0:*  users:(("nginx",pid=XXXX,fd=6))

Ini membuktikan Nginx benar-benar listening di port 80, bukan cuma service yang jalan tanpa bind ke port.

Cara 4: Test Langsung dari Server

curl -I http://localhost

Output HTTP/1.1 200 OK di baris pertama adalah tanda sukses. Kalau kamu tidak punya akses browser tapi perlu verifikasi cepat dari terminal, ini cara paling praktis.

Troubleshooting: 4 Masalah yang Sering Muncul

1. Error: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

Gejala: Nginx tidak mau start, muncul error ini di log atau saat nginx -t.

Root cause: Ada proses lain yang sudah “menduduki” port 80. Biasanya Apache yang masih aktif, atau instance Nginx lain yang belum dimatikan.

Solusi:

# Cek siapa yang pakai port 80
sudo lsof -i :80

# Kalau Apache yang jalan, matikan dulu
sudo systemctl stop apache2
sudo systemctl disable apache2

# Jalankan ulang Nginx
sudo systemctl start nginx

Pencegahan: Sebelum install Nginx di server baru, selalu cek dulu apakah ada web server lain yang aktif.

2. Error 403 Forbidden pada File Statis

Gejala: Browser menampilkan “403 Forbidden” padahal file-nya ada di direktori yang benar.

Root cause: Permission file atau direktori tidak mengizinkan user www-data (user yang dipakai Nginx) untuk membaca file tersebut.

Solusi:

# Cek permission direktori web
ls -la /var/www/html/

# Set ownership ke www-data
sudo chown -R www-data:www-data /var/www/namasite/

# Set permission yang benar
sudo chmod -R 755 /var/www/namasite/

Pencegahan: Setiap kali upload file ke server, pastikan ownership dan permission sudah sesuai.

3. Perubahan Config Tidak Berpengaruh Setelah Reload

Gejala: Sudah edit konfigurasi, sudah reload, tapi behavior Nginx di browser tidak berubah.

Root cause: Kamu mungkin mengedit file di sites-available tapi lupa buat symlink ke sites-enabled, atau mengedit file yang berbeda dari yang aktif.

Solusi:

# Cek konfigurasi mana yang sedang aktif
ls -la /etc/nginx/sites-enabled/

# Verifikasi isi konfigurasi yang terbaca Nginx
sudo nginx -T | grep server_name

Tip: Gue biasanya langsung edit file di sites-available dan pastikan symlink-nya ada. Jangan pernah edit langsung file di sites-enabled.

4. Kesalahan yang Jarang Dibahas Tutorial Lain: upstream sent invalid header

Gejala: Nginx jalan normal, tapi semua request ke aplikasi backend (Node.js, Python, dll.) balik dengan 502 Bad Gateway dan di log ada upstream sent invalid header.

Root cause: Aplikasi backend kamu mengirimkan HTTP response dengan format header yang tidak standar, atau proses backend sudah mati tapi Nginx masih coba koneksi ke sana.

Solusi:

# Cek apakah proses backend masih hidup
sudo ss -tlnp | grep :3000  # Ganti 3000 dengan port aplikasi kamu

# Lihat log error Nginx secara realtime
sudo tail -f /var/log/nginx/error.log

# Restart aplikasi backend (contoh pakai PM2)
pm2 restart app

Pencegahan: Gunakan process manager seperti PM2 untuk Node.js atau Supervisor untuk Python agar aplikasi backend otomatis restart kalau crash. Nginx hanya bisa forward request, dia tidak bisa menghidupkan backend yang sudah mati.

Perintah Nginx Sehari-hari

Perintah Fungsi Kapan Dipakai
sudo systemctl start nginx Menjalankan Nginx Setelah server reboot manual atau Nginx dimatikan
sudo systemctl stop nginx Mematikan Nginx Saat maintenance atau mengganti port yang dipakai Nginx
sudo systemctl restart nginx Restart penuh Setelah perubahan besar seperti ganti port atau install modul baru
sudo systemctl reload nginx Reload konfigurasi tanpa putus koneksi Setelah edit konfigurasi di lingkungan production
sudo nginx -t Test validitas konfigurasi Sebelum setiap kali reload atau restart
sudo nginx -T Print semua konfigurasi aktif Saat debug dan ingin lihat full config yang sedang dipakai
sudo tail -f /var/log/nginx/error.log Monitor error secara realtime Saat debug masalah yang muncul di tengah sesi aktif
sudo tail -f /var/log/nginx/access.log Monitor semua request masuk Saat cek apakah traffic sudah masuk atau verifikasi routing
sudo ufw status Cek status firewall Setiap kali ada masalah koneksi yang aneh dari luar

Nginx vs Alternatifnya: Pendapat Gue Setelah Pakai Keduanya

Setelah pindah dari Apache ke Nginx dan tidak pernah balik lagi, gue punya pendapat yang cukup kuat soal ini.

Apache masih relevan kalau kamu butuh .htaccess per-direktori untuk aplikasi shared hosting atau CMS seperti WordPress yang sangat bergantung pada fitur itu. Tapi kalau setup server sendiri dari nol, Nginx hampir selalu lebih masuk akal: konsumsi memori lebih rendah, performa di high-concurrency jauh lebih baik, dan konfigurasinya menurut gue lebih mudah dibaca setelah terbiasa.

Ada juga Caddy sebagai alternatif modern yang otomatis urus HTTPS via Let’s Encrypt tanpa konfigurasi tambahan. Menarik untuk project personal. Tapi untuk production serius dengan kebutuhan konfigurasi spesifik, ekosistem dokumentasi dan komunitas Nginx masih jauh lebih mature.

FAQ Singkat

Apakah Nginx bisa dipakai bersama Apache di server yang sama?

Bisa, tapi tidak disarankan untuk pemula. Setup paling umum adalah Nginx sebagai reverse proxy di depan yang forward request ke Apache di port lain (misalnya 8080). Tapi kalau tidak ada alasan kuat, pilih salah satu saja.

Port berapa yang dipakai Nginx secara default?

Port 80 untuk HTTP dan 443 untuk HTTPS. Ini bisa diubah di konfigurasi server block, tapi mengubah dari default biasanya hanya perlu untuk kasus spesifik seperti menjalankan beberapa web server di satu mesin.

Apakah Nginx otomatis jalan setelah server reboot?

Hanya kalau kamu sudah jalankan sudo systemctl enable nginx. Tanpa itu, Nginx perlu distart manual setiap kali server reboot.

Di mana file konfigurasi utama Nginx?

File utamanya di /etc/nginx/nginx.conf. Konfigurasi per-site ada di /etc/nginx/sites-available/ dan yang aktif di-symlink ke /etc/nginx/sites-enabled/.

Kalau kamu sudah sampai sini dan Nginx kamu sudah jalan, selamat datang di dunia sysadmin yang lebih menyenangkan. Dan kalau suatu malam kamu duduk di depan layar debug error Nginx jam 2 pagi, ingat: kamu tidak sendirian. Gue sudah lebih sering melakukan itu dari yang gue mau akui.

Leave a Reply

Your email address will not be published. Required fields are marked *