Sebelum memulai praktik, pastikan Anda telah memahami konsep dasar pada materi kelas Server & DevOps di infokoding.

BAB 9

Konfigurasi Virtual Host Nginx di Linux

Panduan taktis membuat virtual host Nginx untuk melayani multi-domain.

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 ke sites-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.

Diagram arsitektur Nginx untuk konfigurasi Virtual Host dan Reverse Proxy
Visualisasi Arsitektur Teks: Nginx bertindak sebagai gerbang terluar (Web Server / Reverse Proxy) yang menerima seluruh trafik HTTP/HTTPS. Nginx mampu menyajikan file statis (HTML/CSS/JS) secara langsung dari /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.

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 perintah sudo systemctl status php8.1-fpm. Pastikan path unix socket pada direktif fastcgi_pass atau alamat port pada proxy_pass sudah 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 (umumnya www-data pada Ubuntu/Debian). Gunakan perintah sudo chown -R www-data:www-data /var/www/infokoding/public_html dan berikan *chmod* 755 untuk folder.
  • Error 404 Not Found: Nginx tidak dapat menemukan file aset web yang diminta.
    Solusi: Cek kembali deklarasi variabel root di dalam blok server dan pastikan file wajib seperti index.html atau index.php memang 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


Profil Penulis Rusmawan Abdullah Sani., S.Kom

Rusmawan Abdullah Sani., S.Kom

Senior DevOps Engineer

DevOps Engineer tersertifikasi dengan spesialisasi pada High Availability Web Architecture, Administrasi Server Linux, dan Infrastruktur Cloud Native. Aktif membagikan studi kasus seputar performa web dan keamanan siber.