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.