Panduan taktis membuat virtual host Nginx untuk melayani multi-domain.
Daftar Isi
- AI Preview (Ringkasan Cepat)
- Ringkasan Eksekutif (TL;DR)
- Tabel Ringkasan Perintah Nginx (Cheat Sheet)
- Perbandingan: Nginx Server Block vs Apache Virtual Host
- Perbandingan Web Server Modern: Nginx vs Caddy
- Prasyarat & Spesifikasi Minimum
- Belajar DevOps: Panduan Taktis Langkah demi Langkah
- Langkah 1: Membuat Berkas Server Block
- Langkah 2: Menulis Konfigurasi Virtual Host & PHP
- Konfigurasi Multi-PHP Version (Lanjutan)
- Langkah 3: Optimasi Performa Dasar (Gzip & Caching)
- Optimasi TCP/IP Kernel Linux (sysctl.conf)
- Langkah 4: Mengaktifkan Konfigurasi via Symbolic Link
- Langkah 5: Pengujian dan Restart Service
- Keamanan Tambahan & Standar Web Modern
- Membuka Akses Firewall (UFW)
- Instalasi SSL Gratis (Certbot) dan Aktivasi HTTP/2
- Masa Depan Web: Konfigurasi HTTP/3 (QUIC)
- Belajar DevOps Modern: Nginx dalam Docker (Kontainer)
- Integrasi Nginx dengan Monitoring Prometheus & Grafana
- Belajar DevOps Lanjutan: Nginx sebagai Reverse Proxy
- Integrasi Peladen Cloud (AWS, GCP, & DigitalOcean)
- Otomatisasi Deployment (Bash Script)
- Troubleshooting Error Umum Nginx
- FAQ: Pertanyaan Umum Seputar Nginx
- Bagaimana cara mengonfigurasi Nginx untuk Node.js menggunakan PM2 secara otomatis?
- Bagaimana cara mengatasi error 504 Gateway Timeout pada Nginx?
- Bagaimana langkah konkret penanganan rate limiting untuk mencegah DDoS di level Nginx?
- Kesimpulan
- Daftar Pustaka & Referensi Eksternal
AI Preview (Ringkasan Cepat)
Untuk mengonfigurasi Virtual Host Nginx di Linux, buat file konfigurasi di /etc/nginx/sites-available/, lalu aktifkan dengan membuat symbolic link ke /etc/nginx/sites-enabled/. Pastikan menguji sintaks menggunakan perintah sudo nginx -t sebelum melakukan restart.
Ringkasan Eksekutif (TL;DR)
- Server Block Nginx (Virtual Host) memungkinkan satu IP server melayani puluhan hingga ratusan nama domain/website secara bersamaan.
- Direktori Utama: File konfigurasi dibuat di
/etc/nginx/sites-available/dan diaktifkan (enabled) melalui pembuatan symbolic link kesites-enabled/. - Multi-PHP & Reverse Proxy: Nginx sangat andal digunakan sebagai gerbang proksi untuk Node.js atau Python, serta mampu menjalankan multi-versi PHP (misal PHP 7.4 & 8.1) secara paralel tanpa bentrok.
- Performa Web Modern: Mendukung kompresi Gzip, pemasangan SSL Let's Encrypt (Certbot) secara otomatis, dan aktivasi protokol super cepat HTTP/2 dan HTTP/3 (QUIC).
Sebelum memulai praktik, pastikan Anda telah memahami konsep dasar pengelolaan Server Linux. Dalam panduan ini, kita akan fokus membahas langkah demi langkah Konfigurasi Virtual Host Nginx secara komprehensif sebagai bekal fundamental dalam ranah belajar DevOps terapan.
/var/www dengan sangat cepat. Sementara kueri dinamis (seperti eksekusi script PHP) akan dilempar (proxied) ke layanan backend seperti PHP-FPM melalui FastCGI Unix Socket, atau Node.js melalui HTTP Proxy, yang pada akhirnya berkomunikasi dengan Database.
Tabel Ringkasan Perintah Nginx (Cheat Sheet)
Gunakan tabel referensi cepat ini untuk mengelola operasional server Nginx harian Anda:
| Aksi / Perintah | Keterangan Singkat |
|---|---|
sudo nginx -t |
Uji sintaks konfigurasi Nginx sebelum me-restart server |
sudo systemctl reload nginx |
Terapkan konfigurasi baru tanpa mematikan layanan (Zero Downtime) |
sudo ln -s /etc/nginx/sites-available/... |
Mengaktifkan Server Block via Symlink ke sites-enabled |
tail -f /var/log/nginx/error.log |
Memantau log error Nginx secara *real-time* |
Perbandingan: Nginx Server Block vs Apache Virtual Host
Banyak pengembang masih ragu memilih antara Nginx dan Apache untuk men-deploy aplikasi mereka. Berikut adalah panduan use-case berdasarkan kelebihan arsitekturnya:
| Fitur & Kinerja | Nginx (Server Block) | Apache (Virtual Host) |
|---|---|---|
| Arsitektur Pemrosesan | Event-driven (asynchronous). Sangat ringan dan memakan sangat sedikit RAM. | Process-driven (umumnya membuka *thread* baru per *request* klien). |
| Menangani Trafik Tinggi (High Concurrency) | Juara: Tak tertandingi dalam menyajikan aset statis ke ribuan koneksi bersamaan. | Bisa kewalahan dan berisiko OOM (Out Of Memory) jika terkena *spike traffic*. |
| Fleksibilitas Direktori | Tidak mendukung .htaccess. Seluruh modifikasi *rewrite* harus terpusat di file server. |
Juara: Sangat fleksibel berkat adanya .htaccess untuk tiap folder pengguna. |
| Rekomendasi Use-Case | Microservices, Reverse Proxy (Node/Python), Load Balancer, API Gateway, Web Skala Enterprise. | Shared Hosting (cPanel), WordPress konvensional, aplikasi monolith warisan (Legacy). |
Perbandingan Web Server Modern: Nginx vs Caddy
Selain Apache, ekosistem DevOps modern juga diramaikan oleh web server generasi baru seperti Caddy dan Traefik. Berikut adalah komparasi Nginx dengan Caddy yang sangat sering menjadi bahan pertimbangan dalam infrastruktur Cloud-Native modern:
| Fitur Utama | Nginx | Caddy Server |
|---|---|---|
| Manajemen SSL (HTTPS) | Manual menggunakan Certbot / Let's Encrypt pihak ketiga. | Juara: SSL (HTTPS) terpasang dan diperbarui otomatis secara native. |
| Kecepatan & Performa Skala Besar | Juara: Menggunakan bahasa C murni, mendominasi throughput mentah tertinggi di industri. | Ditulis dengan Go. Sangat cepat, namun konsumsi CPU sedikit lebih tinggi saat trafik sangat masif. |
| Kemudahan Konfigurasi | Memerlukan pemahaman sintaks Server Block yang sangat teliti. | Juara: Konfigurasi Caddyfile luar biasa sederhana (seringkali cuma 1 baris untuk proksi). |
Prasyarat & Spesifikasi Minimum
- Sistem Operasi: Ubuntu 24.04 LTS (Noble Numbat) atau Debian 12.
- Web Server: Nginx versi 1.26.x (Stable) atau 1.27.x (Mainline) terbaru untuk dukungan penuh protokol QUIC.
- CPU & RAM: Minimal 1 vCore CPU & 1 GB RAM (Disarankan 2 GB jika menjalankan banyak pool worker PHP-FPM).
Belajar DevOps: Panduan Taktis Langkah demi Langkah
Langkah 1: Membuat Berkas Server Block
Buat berkas konfigurasi baru di direktori /etc/nginx/sites-available/. Sebagai contoh, untuk domain infokoding.com:
sudo nano /etc/nginx/sites-available/infokoding.com
Langkah 2: Menulis Konfigurasi Virtual Host & PHP
Masukkan aturan server block dasar berikut. Konfigurasi ini menyertakan blok integrasi PHP-FPM untuk mengeksekusi skrip PHP:
server {
listen 80;
server_name infokoding.com www.infokoding.com;
root /var/www/infokoding/public_html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
# Blok untuk mengeksekusi PHP via FastCGI
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
}
Konfigurasi Multi-PHP Version (Lanjutan)
Salah satu kekuatan utama Nginx adalah kemampuannya menjalankan banyak versi PHP secara bersamaan (misal PHP 7.4 dan PHP 8.1) pada satu server fisik, cukup dengan membedakan unix socket pada blok lokasi spesifik:
# Aplikasi Utama berjalan di PHP 8.1
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
# Endpoint khusus (API Legacy) berjalan di PHP 7.4
location ^~ /api-legacy/ {
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}
Langkah 3: Optimasi Performa Dasar (Gzip & Caching)
Untuk mempercepat waktu muat situs secara drastis dan menghemat penggunaan *bandwidth* peladen hingga 70%, tambahkan konfigurasi optimasi berikut di dalam blok server Anda:
# Mengaktifkan Kompresi Gzip
gzip on;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript text/xml;
# Browser Caching untuk Aset Statis (1 Tahun)
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
expires 365d;
add_header Cache-Control "public, no-transform";
}
Optimasi TCP/IP Kernel Linux (sysctl.conf)
Nginx yang dioptimasi tidak akan bisa mencapai performa maksimalnya jika sistem operasi yang mendasarinya (kernel Linux) masih menggunakan limitasi bawaan. Bagi Anda yang sedang belajar DevOps untuk menangani jutaan requests, modifikasi file /etc/sysctl.conf adalah hal yang wajib:
# Tambahkan baris berikut di bagian bawah /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_tw_reuse = 1
Setelah ditambahkan, terapkan perubahan kernel tersebut secara instan menggunakan perintah sudo sysctl -p. Parameter ini akan melipatgandakan batasan jumlah koneksi paralel dan mempercepat siklus penggunaan ulang soket TCP pada peladen yang sibuk.
Langkah 4: Mengaktifkan Konfigurasi via Symbolic Link
Agar Nginx membaca konfigurasi tersebut, buat sebuah symbolic link (shortcut) dari folder sites-available ke sites-enabled:
sudo ln -s /etc/nginx/sites-available/infokoding.com /etc/nginx/sites-enabled/
Catatan: Gunakan path absolut untuk menghindari error 'broken link'.
Langkah 5: Pengujian dan Restart Service
Selalu lakukan uji sintaks untuk memastikan tidak ada kesalahan konfigurasi sebelum melakukan *restart* server Nginx:
sudo nginx -t
Jika tampil pesan syntax is ok, restart layanan Nginx untuk menerapkan perubahan:
sudo systemctl restart nginx
Keamanan Tambahan & Standar Web Modern
Membuka Akses Firewall (UFW)
Pastikan port HTTP (80) dan HTTPS (443) diizinkan melewati firewall jaringan server Anda:
sudo ufw allow 'Nginx Full'
sudo ufw reload
Instalasi SSL Gratis (Certbot) dan Aktivasi HTTP/2
Langkah pertama, pasang sertifikat SSL dari Let's Encrypt secara otomatis (pastikan DNS domain Anda sudah mengarah ke IP Server):
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d infokoding.com -d www.infokoding.com
Secara bawaan Nginx beroperasi menggunakan protokol HTTP/1.1 yang lambat. Untuk mendongkrak skor Core Web Vitals dan kecepatan muat secara eksponensial (berkat fitur *Multiplexing* unduhan paralel), Anda diwajibkan mengaktifkan protokol HTTP/2.
Buka kembali blok *Server* Anda (setelah dimodifikasi Certbot), lalu tambahkan argumen http2 tepat setelah argumen ssl:
server {
# Tambahkan parameter 'http2' untuk mengaktifkan protokol web modern
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name infokoding.com www.infokoding.com;
# Konfigurasi Sertifikat Let's Encrypt (Umumnya dihasilkan otomatis)
ssl_certificate /etc/letsencrypt/live/infokoding.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/infokoding.com/privkey.pem;
# ... konfigurasi root dan location lainnya ...
}
Masa Depan Web: Konfigurasi HTTP/3 (QUIC)
Bagi Anda yang mengedepankan performa maksimal, Nginx (mulai versi 1.25.0) telah merilis dukungan native untuk protokol HTTP/3 berbasis QUIC (protokol UDP). HTTP/3 memangkas drastis latensi di perangkat seluler dengan sinyal lemah berkat kemampuannya memecahkan masalah Head-of-Line blocking pada TCP standar.
Untuk mengaktifkannya, Anda hanya perlu menambahkan listen 443 quic dan memberikan *Header* ke browser klien (memastikan *firewall* Anda mengizinkan lalu lintas UDP port 443):
server {
# HTTP/2 preko TCP
listen 443 ssl http2;
listen [::]:443 ssl http2;
# HTTP/3 preko UDP (QUIC)
listen 443 quic reuseport;
listen [::]:443 quic reuseport;
server_name infokoding.com www.infokoding.com;
# Memberitahu browser klien bahwa server siap melayani HTTP/3
add_header Alt-Svc 'h3=":443"; ma=86400';
ssl_certificate /etc/letsencrypt/live/infokoding.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/infokoding.com/privkey.pem;
}
Belajar DevOps Modern: Nginx dalam Docker (Kontainer)
Dalam lanskap DevOps modern, konfigurasi server secara langsung di OS (Bare Metal) mulai berevolusi menggunakan teknologi kontainerisasi seperti Docker dan orkestrasi Kubernetes. Menjalankan Nginx di dalam Docker menjamin lingkungan server yang identik antara mesin pengembang (lokal) dengan peladen produksi (production).
Berikut adalah konfigurasi docker-compose.yml dasar untuk mendirikan kluster Web Server mandiri yang terisolasi:
version: '3.8'
services:
web:
image: nginx:alpine
container_name: nginx_web
ports:
- "80:80"
- "443:443"
volumes:
- ./public_html:/usr/share/nginx/html
- ./nginx/conf.d:/etc/nginx/conf.d
restart: unless-stopped
Melalui teknik volume mapping, Anda dapat memodifikasi Server Block (*Virtual Host*) dari sistem operasi induk (host) tanpa perlu melakukan *SSH* atau masuk ke dalam kontainer Linux yang terisolasi tersebut. Segala perubahan konfigurasi seketika tercermin di dalam kontainer secara *real-time*.
Integrasi Nginx dengan Monitoring Prometheus & Grafana
Infrastruktur peladen tidak akan berarti tanpa sistem pemantauan (monitoring) yang mumpuni. Nginx menyediakan modul stub_status bawaan untuk mengekspos metrik vital operasional.
server {
listen 80;
server_name localhost;
location /nginx_status {
stub_status;
allow 127.0.0.1; # Hanya izinkan dari localhost
deny all; # Tolak akses dari internet
}
}
Akses ke URL internal http://localhost/nginx_status akan menampilkan data aktif koneksi. Dalam arsitektur modern, metrik ini biasanya "disedot" (scraped) secara periodik oleh Nginx Prometheus Exporter, lalu divisualisasikan menjadi dasbor interaktif yang sangat kaya dan informatif menggunakan Grafana. Merakit dasbor telemetri seperti ini adalah salah satu kurikulum utama saat Anda belajar DevOps di tingkat mahir.
Belajar DevOps Lanjutan: Nginx sebagai Reverse Proxy
Jika Anda menjalankan aplikasi web modern (seperti Node.js atau Python FastAPI) yang berjalan sebagai daemon di port lokal (misal: port 3000), Anda dapat mengonfigurasi Nginx sebagai gerbang Reverse Proxy. Cukup ubah blok location / menjadi:
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;
}
Integrasi Peladen Cloud (AWS, GCP, & DigitalOcean)
Saat Anda mempraktekkan ilmu ini di ekosistem Cloud Provider global, ada beberapa aspek arsitektur jaringan (*networking*) yang perlu disesuaikan dengan infrastruktur peladen Nginx Anda:
- Amazon Web Services (AWS): Jika Anda menginstal Nginx di atas *Instance EC2*, pastikan untuk mengatur konfigurasi Security Group yang mengizinkan *Inbound Rules* untuk lalu lintas HTTP (Port 80) dan HTTPS (Port 443). Untuk arsitektur berskala besar, biasanya peladen Nginx diletakkan di belakang AWS Application Load Balancer (ALB).
- Google Cloud Platform (GCP): Pada saat pembuatan Compute Engine, pastikan untuk mencentang kotak "Allow HTTP traffic" dan "Allow HTTPS traffic" di pengaturan *Firewall*. Di tingkatan lanjut, Anda juga dapat mengawinkan Cloud Armor dengan Nginx untuk menangkal serangan DDoS massal pada level proksi DNS.
- DigitalOcean: Lingkungan Droplets di DigitalOcean sangat ramah pemula. Anda dianjurkan untuk memanfaatkan fitur Cloud Firewalls bawaan dari panel kontrol untuk membatasi akses SSH hanya ke alamat IP Anda secara eksklusif.
Otomatisasi Deployment (Bash Script)
Bagi administrator DevOps yang mengelola banyak Virtual Host, mengotomatiskan proses menggunakan Bash Script dapat mempercepat pekerjaan. Simpan kode ini sebagai setup_vhost.sh dan jalankan: sudo ./setup_vhost.sh namadomain.com.
#!/bin/bash
DOMAIN=$1
ROOT_DIR="/var/www/$DOMAIN/public_html"
mkdir -p $ROOT_DIR
chown -R $USER:$USER $ROOT_DIR
cat > /etc/nginx/sites-available/$DOMAIN <<EOF
server {
listen 80;
server_name $DOMAIN www.$DOMAIN;
root $ROOT_DIR;
index index.html index.php;
location / {
try_files \$uri \$uri/ =404;
}
}
EOF
ln -s /etc/nginx/sites-available/$DOMAIN /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
echo "Virtual Host $DOMAIN berhasil dibuat!"
Troubleshooting Error Umum Nginx
Berikut adalah solusi teruji untuk beberapa kode error HTTP Nginx yang paling sering ditemui saat mengelola server (troubleshooting):
- Error 502 Bad Gateway: Error ini terjadi ketika Nginx (sebagai proxy atau web server depan) tidak dapat berkomunikasi dengan aplikasi backend (seperti PHP-FPM, Node.js, atau database).
Solusi: Periksa status *backend service* menggunakan perintahsudo systemctl status php8.1-fpm. Pastikan path unix socket pada direktiffastcgi_passatau alamat port padaproxy_passsudah diketik dengan tepat dan layanannya sedang aktif (running). - Error 403 Forbidden: Ini menandakan Nginx berhasil menemukan folder, tetapi ditolak membaca isi file di dalamnya.
Solusi: Umumnya merupakan kesalahan permission (hak akses file sistem). Pastikan direktori root dimiliki oleh user Nginx (umumnyawww-datapada Ubuntu/Debian). Gunakan perintahsudo chown -R www-data:www-data /var/www/infokoding/public_htmldan berikan *chmod* 755 untuk folder. - Error 404 Not Found: Nginx tidak dapat menemukan file aset web yang diminta.
Solusi: Cek kembali deklarasi variabelrootdi dalam blok server dan pastikan file wajib sepertiindex.htmlatauindex.phpmemang benar-benar tersedia di direktori tersebut secara fisik.
FAQ: Pertanyaan Umum Seputar Nginx
Bagaimana cara mengonfigurasi Nginx untuk Node.js menggunakan PM2 secara otomatis?
Jalankan aplikasi Node.js Anda dengan perintah pm2 start app.js, lalu jalankan pm2 startup dan pm2 save. Setelah PM2 aktif menjaga aplikasi tetap berjalan (biasanya di port lokal seperti 3000), konfigurasikan Nginx sebagai Reverse Proxy dengan menambahkan proxy_pass http://localhost:3000; pada blok location / di file konfigurasi Virtual Host Anda.
Bagaimana cara mengatasi error 504 Gateway Timeout pada Nginx?
Error 504 terjadi saat aplikasi backend (misal Node.js atau PHP) membutuhkan waktu terlalu lama untuk memproses permintaan (biasanya karena kueri database yang berat). Solusinya adalah dengan menambahkan direktif proxy_read_timeout 300s; (untuk Node.js) atau fastcgi_read_timeout 300s; (untuk PHP-FPM) pada blok konfigurasi Nginx Anda.
Bagaimana langkah konkret penanganan rate limiting untuk mencegah DDoS di level Nginx?
Gunakan direktif limit_req_zone pada blok HTTP (misal: limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;). Kemudian terapkan limit_req zone=mylimit burst=20 nodelay; pada blok server atau location Anda. Ini secara otomatis akan memblokir request yang melebihi batas dengan kode status 503 (Service Unavailable), sehingga backend Anda tetap aman dari kelebihan beban.
Kesimpulan
Mengonfigurasi hierarki Virtual Host, merancang gerbang Reverse Proxy, hingga mengoptimasi limitasi soket kernel sistem operasi Linux bukanlah sekadar hafalan komando semata, melainkan keterampilan krusial di medan industri IT komersial. Perjalanan belajar DevOps tentu saja tidak pernah berhenti pada tahap instalasi peladen web dasar. Dengan menuntaskan penguasaan konfigurasi Nginx ini secara komprehensif, Anda sejatinya telah berhasil membangun fondasi arsitektur High Availability yang siap disinergikan dengan orkestrasi kontainer (*Kubernetes*) dan layanan mesin *Cloud Enterprise* berskala global di masa depan.
Daftar Pustaka & Referensi Eksternal
- Nginx Official Documentation: How nginx processes a request
- Nginx Official Documentation: Module ngx_http_v2_module (HTTP/2)
- Nginx Official Documentation: Module ngx_http_v3_module (HTTP/3 QUIC)
- Certbot EFF: Official SSL Instructions for Nginx on Ubuntu