Cara Install Nginx di VPS Ubuntu (22.04/20.04) – Lengkap untuk Production

Cara Install Nginx di VPS Ubuntu (22.04/20.04) – Lengkap untuk Production

Nginx adalah web server dan reverse proxy yang terkenal ringan, cepat, dan stabil. Di VPS Ubuntu, Nginx sering dipakai untuk hosting website statis/dinamis, menjadi reverse proxy untuk aplikasi (Node.js, Laravel, Docker), serta menangani SSL/TLS. Artikel ini membahas instalasi Nginx yang rapi untuk production: mulai dari update sistem, konfigurasi firewall, server block (virtual host), SSL Let’s Encrypt, hingga hardening dan troubleshooting.

Cocok untuk:

  • VPS Ubuntu 22.04 / 20.04
  • Hosting website (static site / PHP / WordPress)
  • Reverse proxy aplikasi (Node.js / Docker / API)
  • Setup dasar production untuk pemula

Prasyarat

  • VPS Ubuntu 22.04/20.04 dengan akses SSH
  • User non-root dengan akses sudo (disarankan)
  • Domain (opsional, tapi diperlukan kalau mau pasang SSL Let’s Encrypt)

0. Cek Info Server (Opsional tapi Berguna)

Cek versi Ubuntu dan IP publik:

lsb_release -a
ip a
curl -4 ifconfig.me

Cek apakah port 80/443 sudah dipakai aplikasi lain:

sudo ss -tulpn | grep -E ':80|:443' || true

1. Update Sistem

Sebelum install, update package list dan upgrade sistem:

sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y

2. Install Nginx

Install Nginx dari repository Ubuntu (stable dan cukup untuk production):

sudo apt install nginx -y

Cek status service dan aktifkan saat boot:

sudo systemctl status nginx
sudo systemctl enable nginx

Cek versi Nginx:

nginx -v

3. Konfigurasi Firewall (UFW)

Firewall penting agar server tidak membuka port yang tidak perlu. Kalau kamu belum aktifkan UFW, aktifkan dengan aturan minimal: SSH + HTTP/HTTPS.

Cek profil aplikasi Nginx:

sudo ufw app list

Izinkan OpenSSH agar tidak terkunci dari server:

sudo ufw allow OpenSSH

Izinkan trafik web (HTTP+HTTPS):

sudo ufw allow 'Nginx Full'

Aktifkan UFW dan cek status:

sudo ufw enable
sudo ufw status

4. Tes Akses Nginx

Buka di browser: http://IP_VPS_KAMU

Jika halaman welcome Nginx muncul, instalasi sukses.

Tes dari terminal (opsional):

curl -I http://127.0.0.1

5. Buat Server Block (Virtual Host)

Server block membuat konfigurasi per-domain/per-site jadi rapi. Ini penting untuk mengelola banyak website dalam satu VPS.

5.1 Buat Folder Website

Contoh domain: example.com (ganti sesuai domain kamu).

sudo mkdir -p /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/example.com/html
sudo chmod -R 755 /var/www/example.com

Buat halaman tes:

nano /var/www/example.com/html/index.html

Isi sederhana:

<!doctype html>
<html>
  <head><meta charset="utf-8"><title>example.com</title></head>
  <body><h1>Nginx OK – example.com</h1></body>
</html>



5.2 Buat Konfigurasi Server Block

Buat file config di sites-available:

sudo nano /etc/nginx/sites-available/example.com

Contoh konfigurasi (HTTP dulu):

server {
    listen 80;
    listen [::]:80;

    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html index.htm;

    access_log /var/log/nginx/example.com.access.log;
    error_log  /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ =404;
    }
}

5.3 Enable Site & Disable Default

Aktifkan site dengan symlink:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Opsional: nonaktifkan default site:

sudo rm /etc/nginx/sites-enabled/default

Tes konfigurasi dan reload:

sudo nginx -t
sudo systemctl reload nginx

5.4 Pastikan DNS Sudah Mengarah ke VPS

Di DNS provider, pastikan A record untuk example.com dan www mengarah ke IP VPS. Kalau DNS belum benar, SSL Let’s Encrypt bisa gagal.

6. Pasang SSL Gratis Let’s Encrypt (Certbot)

Install Certbot + plugin Nginx:

sudo apt install certbot python3-certbot-nginx -y

Jalankan Certbot:

sudo certbot --nginx -d example.com -d www.example.com

Cek auto-renewal:

sudo systemctl status certbot.timer
sudo certbot renew --dry-run

7. Contoh Reverse Proxy (Node.js / App di Port 3000)

Jika aplikasi berjalan di port internal (misalnya Node.js di 3000), Nginx bisa menjadi reverse proxy agar user akses dari domain di port 80/443.

Tambahkan blok ini di dalam server { ... }:

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_cache_bypass $http_upgrade;
}


Tes dan reload setelah edit:

sudo nginx -t
sudo systemctl reload nginx

8. Hardening Dasar Nginx (Production)

8.1 Sembunyikan Versi Nginx

Edit /etc/nginx/nginx.conf, di dalam blok http { ... } tambahkan:

server_tokens off;

Reload:

sudo systemctl reload nginx

8.2 Security Headers (Basic)

Tambahkan di server block (di dalam server { ... }):

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;

Jika sudah HTTPS, opsional HSTS (hati-hati di staging):

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

8.3 Limit Request (Anti Abuse Ringan)

Tambahkan di http { ... } pada nginx.conf:

limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

Lalu di server { ... } atau location /:

limit_req zone=one burst=20 nodelay;

9. Log, Monitoring, dan Lokasi File Penting

  • Konfigurasi utama: /etc/nginx/nginx.conf
  • Server block: /etc/nginx/sites-available/ dan /etc/nginx/sites-enabled/
  • Web root umum: /var/www/
  • Log akses: /var/log/nginx/access.log (atau per-site)
  • Log error: /var/log/nginx/error.log (atau per-site)

Pantau log realtime:

sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log

10. Troubleshooting Umum

10.1 Nginx Tidak Mau Start / Reload

Tes konfigurasi:

sudo nginx -t

Lihat log:

sudo journalctl -u nginx --no-pager -n 100

10.2 502 Bad Gateway (Reverse Proxy)

  • Aplikasi target (port 3000) mati / belum jalan.
  • proxy_pass mengarah ke host/port yang salah.
  • Aplikasi tidak bind ke 127.0.0.1 atau portnya beda.

Cek app listening:

sudo ss -tulpn | grep 3000 || true

Tes endpoint:

curl -I http://127.0.0.1:3000

10.3 403 Forbidden

  • Permission folder /var/www salah (chown/chmod).
  • root path di server block salah.
  • index file tidak ada.

Cek permission cepat:

ls -la /var/www/example.com/html
sudo chown -R www-data:www-data /var/www/example.com/html

10.4 SSL Certbot Gagal

  • DNS belum mengarah ke IP VPS.
  • Port 80 tidak terbuka (UFW belum allow).
  • Proxy CDN (mis. Cloudflare) mengganggu challenge — matikan proxy sementara.

11. Kesimpulan

Nginx sekarang sudah terpasang di VPS Ubuntu dengan setup yang rapi: firewall aktif, server block per-domain, SSL Let’s Encrypt, serta opsi reverse proxy untuk aplikasi. Ini sudah cukup solid sebagai baseline production. Selanjutnya kamu bisa lanjut ke optimasi performa (gzip/brotli, caching) atau setup Docker + Nginx reverse proxy.