Pengenalan Nginx

Pengenalan Nginx #

Sebelum kamu menulis satu baris konfigurasi Nginx, ada pertanyaan yang lebih mendasar yang perlu dijawab: mengapa kamu harus peduli dengan fondasi konseptual sebuah web server? Jawabannya sederhana — konfigurasi yang kamu buat setiap hari mencerminkan keputusan arsitektur yang dibuat dua dekade lalu. Memahami keputusan-keputusan itu mengubah kamu dari seseorang yang menghafal konfigurasi menjadi seseorang yang memahami mengapa konfigurasi itu ada. Section ini membangun fondasi itu.

Apa yang Akan Kamu Pelajari di Section Ini #

Section Pengenalan mencakup empat artikel yang saling melengkapi. Urutan bacanya penting — setiap artikel membangun di atas pemahaman dari artikel sebelumnya.

Peta Section 01 — Pengenalan:

[Apa itu Nginx?]
    ↓ "Nginx bisa melakukan banyak hal — tapi apa sebenarnya?"
[Sejarah & Evolusi]
    ↓ "Mengapa Nginx dibuat, dan mengapa ia dirancang seperti ini?"
[Nginx vs Apache]
    ↓ "Kapan memilih Nginx, kapan Apache masih lebih cocok?"
[Arsitektur Event-Driven]
    ↓ "Bagaimana Nginx bekerja dari dalam?"
    ↓
[SIAP untuk Section 02 — Instalasi]

Setelah menyelesaikan section ini, kamu tidak hanya tahu cara menggunakan Nginx — kamu memahami mengapa ia bekerja dengan cara tertentu. Ini akan membuat debugging, optimasi, dan pengambilan keputusan arsitektur jauh lebih mudah.


Gambaran Besar: Nginx dalam Infrastruktur Modern #

Nginx adalah perangkat lunak yang duduk di persimpangan antara internet dan aplikasimu. Setiap kali seseorang mengakses websitemu, request mereka melewati Nginx sebelum mencapai kode aplikasimu — dan respons dari aplikasimu melewati Nginx lagi sebelum sampai ke browser mereka.

Posisi ini memberikan Nginx kekuatan yang luar biasa: ia bisa memeriksa, memodifikasi, mengarahkan, membatasi, dan mengoptimalkan setiap request yang melewatinya. Tapi posisi ini juga membawa tanggung jawab: jika Nginx dikonfigurasi salah atau berhenti, tidak ada satupun request yang bisa mencapai aplikasimu.

Posisi Nginx dalam Stack Web Modern:

Pengguna di seluruh dunia
        │
        ▼
  [Internet / CDN]
  (Cloudflare, Akamai, AWS CloudFront)
        │
        ▼
  ┌─────────────────────────────────────────┐
  │              N G I N X                  │
  │                                         │
  │  Yang Nginx lakukan di posisi ini:      │
  │  ✓ Menerima dan memvalidasi koneksi     │
  │  ✓ Menangani HTTPS/TLS                  │
  │  ✓ Rate limiting & DDoS protection      │
  │  ✓ Routing request ke backend tepat     │
  │  ✓ Load balancing antar server          │
  │  ✓ Melayani file statis langsung        │
  │  ✓ Caching response backend             │
  │  ✓ Logging semua aktivitas              │
  └────────────┬───────────────┬────────────┘
               │               │
        ┌──────┘               └──────┐
        ▼                             ▼
  [Backend App 1]             [Backend App 2]
  Node.js / Python             PHP / Ruby
  port 3000                    port 8000
        │                             │
        └──────────┬──────────────────┘
                   ▼
           [Database / Cache]
           PostgreSQL, Redis

Tidak ada komponen lain dalam stack web yang memiliki visibilitas seluas Nginx atas semua trafik yang masuk dan keluar. Ini adalah kekuatan sekaligus tanggung jawabnya.


Mengapa Fondasi Konseptual Lebih Penting dari Sintaks #

Banyak tutorial Nginx — terutama yang ada di internet — langsung melompat ke konfigurasi. “Copy-paste ini, ubah domain-mu, selesai.” Pendekatan itu bekerja untuk kasus sederhana, tapi runtuh begitu kamu menghadapi situasi yang tidak persis sama dengan tutorial.

Ada perbedaan besar antara dua jenis orang yang menggunakan Nginx:

Tipe A — Hafalan Konfigurasi:
  - Copy konfigurasi dari tutorial
  - Ubah domain dan path
  - Pray it works
  - Ketika ada error: Google error message, copy solusi lain
  - Tidak tahu mengapa konfigurasi itu bekerja
  - Tidak bisa mengoptimalkan untuk kondisi spesifik

Tipe B — Pemahaman Fondasi:
  - Mengerti mengapa setiap directive ada
  - Bisa menulis konfigurasi dari nol untuk skenario baru
  - Ketika ada error: tahu di mana harus melihat dan mengapa
  - Bisa mengoptimalkan berdasarkan karakteristik workload
  - Bisa menjelaskan konfigurasi ke orang lain

Section ini dirancang untuk membuat kamu menjadi Tipe B.


Nginx Bukan Satu Hal — Ia Adalah Banyak Hal #

Salah satu kebingungan umum pemula adalah mencoba mengkategorikan Nginx sebagai satu hal. “Nginx adalah web server.” Atau “Nginx adalah reverse proxy.” Kenyataannya, Nginx adalah platform yang bisa memainkan berbagai peran tergantung konfigurasi:

Nginx sebagai Web Server #

Dalam peran paling dasar, Nginx melayani file langsung dari disk ke browser:

Browser → [Nginx] → File di disk → Browser
                    (HTML, CSS, JS, gambar, video)

Use case: Website statis, SPA (React/Vue setelah build),
dokumentasi, landing page, CDN origin

Nginx sebagai Reverse Proxy #

Nginx berdiri di depan aplikasi dan meneruskan request:

Browser → [Nginx] → [Aplikasi Node.js/Python/PHP] → [Nginx] → Browser

Use case: Semua aplikasi web modern yang perlu SSL termination,
load balancing, atau caching di depan aplikasi

Nginx sebagai Load Balancer #

Nginx mendistribusikan request ke beberapa server:

Browser → [Nginx] → [Server 1]
                 → [Server 2]
                 → [Server 3]

Use case: Aplikasi dengan trafik tinggi yang perlu horizontal scaling

Nginx sebagai API Gateway #

Nginx mengelola akses ke multiple API services:

Client → [Nginx] → /api/users    → User Service
                 → /api/orders   → Order Service
                 → /api/products → Product Service

Use case: Microservice architecture, routing berbasis path/header

Nginx sebagai SSL Terminator #

Nginx menangani enkripsi HTTPS sehingga backend tidak perlu:

Browser ←HTTPS→ [Nginx] ←HTTP→ Backend
                (Nginx urus semua SSL, backend terima HTTP biasa)

Use case: Hampir semua deployment production modern

Dalam deployment nyata, Nginx seringkali memainkan beberapa peran ini sekaligus untuk aplikasi yang sama.


Filosofi Desain Nginx: Tiga Prinsip Inti #

Memahami filosofi desain Nginx membantu memahami mengapa ia dikonfigurasi dengan cara tertentu, dan mengapa beberapa keputusan yang mungkin terasa aneh pada awalnya sebenarnya sangat disengaja.

1. Efisiensi di Atas Segalanya #

Igor Sysoev merancang Nginx dengan satu obsesi: melakukan lebih banyak dengan lebih sedikit. Setiap keputusan desain — dari model event-driven, tidak adanya .htaccess, hingga pool allocator untuk memori — dibuat dengan pertanyaan: “apakah ini cara paling efisien untuk melakukan ini?”

Manifestasi prinsip efisiensi dalam desain Nginx:

Worker processes = jumlah CPU core
  (tidak lebih, tidak kurang — tidak ada overhead tak perlu)

Tidak ada .htaccess
  (membaca file konfigurasi per-direktori setiap request
   adalah inefisiensi yang bisa dihindari)

Konfigurasi terpusat
  (parse sekali saat load, tidak berulang per-request)

Pool allocator
  (alokasi memori cepat, dealokasi bulk setelah request selesai)

sendfile() untuk file statis
  (zero-copy, kernel langsung transfer dari disk ke network)

2. Dapat Diprediksi di Bawah Beban #

Web server yang bagus bukan hanya yang cepat di kondisi normal, tapi yang dapat diprediksi perilakunya saat beban meningkat. Nginx dirancang agar konsumsi memori dan CPU-nya tidak tiba-tiba melonjak ketika trafik naik.

Perbandingan perilaku di bawah beban:

Apache (model lama):
  100 koneksi:   OK
  500 koneksi:   Mulai berat
  1000 koneksi:  Sangat lambat
  5000 koneksi:  OOM / crash

  Karakteristik: Degradasi tidak linear, sulit diprediksi

Nginx:
  100 koneksi:   OK
  500 koneksi:   OK
  1000 koneksi:  OK (konsumsi memori hampir sama)
  5000 koneksi:  OK (mungkin sedikit lebih lambat, tapi stabil)

  Karakteristik: Degradasi gradual dan dapat diprediksi

Di production, dapat diprediksi seringkali lebih berharga daripada performa puncak yang tidak stabil.

3. Konfigurasi Sebagai Kode #

Nginx menggunakan sintaks konfigurasi yang ekspresif dan dapat di-version control. File konfigurasi Nginx bisa disimpan di Git, di-review oleh tim, dan di-deploy melalui pipeline CI/CD seperti kode aplikasi.

# Alur kerja modern dengan Nginx sebagai kode:

# 1. Edit konfigurasi
vim /etc/nginx/sites-available/myapp.conf

# 2. Test sebelum apply (tidak ada downtime jika salah)
nginx -t

# 3. Reload jika valid (zero-downtime)
nginx -s reload

# 4. Commit ke Git
git add /etc/nginx/
git commit -m "add rate limiting for /api/auth endpoint"
git push

# 5. Otomatis di-deploy via CI/CD pipeline

Ekosistem Nginx: Lebih dari Sekadar Binary #

Ketika kamu menginstal Nginx, kamu bukan hanya menginstal satu program — kamu masuk ke ekosistem yang sangat luas:

Nginx Core (yang kita pelajari) #

Nginx open-source yang tersedia di semua package manager Linux. Ini adalah fokus utama buku ini.

# Ubuntu/Debian
sudo apt install nginx

# CentOS/RHEL
sudo yum install nginx

# Alpine (Docker)
apk add nginx

Nginx Plus #

Versi komersial dengan fitur enterprise tambahan. Harga sekitar $2,500/instance/tahun. Cocok untuk enterprise yang butuh active health checks, live monitoring dashboard, JWT authentication bawaan, dan support resmi dari tim Nginx.

OpenResty #

Distribusi Nginx yang terintegrasi dengan LuaJIT — memungkinkan menulis logika aplikasi langsung di konfigurasi Nginx menggunakan Lua. Sangat populer untuk API gateways dan WAF custom.

-- Contoh: validasi token di Nginx menggunakan Lua (OpenResty)
location /api/ {
    access_by_lua_block {
        local token = ngx.req.get_headers()["Authorization"]
        if not token or not validate_token(token) then
            ngx.status = 401
            ngx.say('{"error": "Unauthorized"}')
            return ngx.exit(401)
        end
    }
    proxy_pass http://backend;
}

Nginx Ingress Controller (Kubernetes) #

Controller Kubernetes yang menerjemahkan resource Ingress menjadi konfigurasi Nginx. Salah satu cara paling umum untuk mengekspos service di Kubernetes ke internet.

# Contoh Kubernetes Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: app.example.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: api-service
                port:
                  number: 80
Ekosistem Nginx (ringkasan):

                    [nginx binary]
                         │
          ┌──────────────┼────────────────────┐
          ▼              ▼                    ▼
    [Nginx Plus]    [OpenResty]        [Nginx Ingress]
    (Commercial)    (Lua+Nginx)        (Kubernetes)
          │              │                    │
          ▼              ▼                    ▼
    [Dashboard]    [Kong API GW]      [cert-manager]
    [JWT Auth]     [APISIX]           [External DNS]
    [Active HC]    [WAF Custom]       [Gateway API]

Persyaratan untuk Mengikuti Buku Ini #

Buku ini dirancang untuk pembaca dengan latar belakang yang beragam. Tapi ada beberapa hal yang diasumsikan sudah kamu ketahui:

Linux dasar. Kamu harus nyaman dengan terminal Linux — navigasi direktori (cd, ls), edit file (vim, nano, atau editor lain), menjalankan perintah dengan sudo, dan membaca output perintah.

Jaringan dasar. Kamu perlu memahami konsep dasar: apa itu IP address, apa itu port, perbedaan HTTP dan HTTPS, dan apa itu DNS. Tidak perlu mengerti detail protokol TCP/IP.

Konsep web dasar. Kamu harus tahu apa itu request dan response HTTP, apa itu GET dan POST, dan apa itu header HTTP.

Yang tidak diperlukan: pengalaman Nginx sebelumnya, pengalaman system administration mendalam, atau pengetahuan tentang Apache.


Versi Nginx yang Digunakan di Buku Ini #

Buku ini ditulis mengacu pada Nginx 1.24.x (stable) dan Nginx 1.25.x (mainline). Sebagian besar konten berlaku untuk Nginx 1.18+.

# Cek versi Nginx yang terinstal
nginx -v
# nginx version: nginx/1.24.0

# Cek versi dengan detail modul yang dikompilasi
nginx -V

Beberapa fitur membutuhkan versi tertentu:

  • HTTP/2: Nginx 1.9.5+
  • Dynamic modules: Nginx 1.9.11+
  • HTTP/3 (QUIC): Nginx 1.25.0+ (mainline)

Cara Membaca Buku Ini #

Buku ini dirancang untuk dibaca secara linear — setiap section membangun di atas section sebelumnya. Tapi ada beberapa pendekatan berbeda:

Jika kamu pemula total: Baca secara berurutan dari Section 01 hingga 13. Jangan skip section Pengenalan meski terasa terlalu teoritis.

Jika kamu sudah punya pengalaman dasar: Kamu mungkin ingin skip atau baca cepat Section 01-03, lalu mulai lebih serius dari Section 04. Tapi tetap baca artikel Arsitektur Event-Driven.

Jika kamu butuh solusi spesifik: Gunakan sidebar untuk navigasi langsung ke topik yang relevan.

Untuk referensi cepat: Setiap artikel diakhiri dengan Ringkasan dalam hint box yang bisa kamu baca dalam 30 detik.


Lingkungan yang Direkomendasikan #

Untuk mengikuti tutorial di buku ini, kamu membutuhkan akses ke server Linux.

Opsi 1: VPS / Cloud Server (Direkomendasikan)
  - DigitalOcean, Linode, Vultr, AWS EC2, GCP e2-micro
  - Spesifikasi minimal: 1 vCPU, 1 GB RAM, Ubuntu 22.04 LTS

Opsi 2: VM Lokal (VirtualBox / VMware)
  - Cocok jika tidak ingin keluar biaya cloud
  - Laptop minimal 4 GB RAM tersedia untuk VM

Opsi 3: WSL2 (Windows)
  - Cocok untuk pembelajaran awal
  - Beberapa fitur jaringan mungkin berbeda

Opsi 4: Docker (untuk eksperimen cepat)
# Docker — cara tercepat untuk mulai eksperimen
docker run -d \
  --name nginx-test \
  -p 80:80 \
  -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro \
  nginx:1.24-alpine

Struktur File yang Akan Kita Bangun #

Sepanjang buku ini, kita akan membangun struktur konfigurasi yang rapi:

/etc/nginx/
├── nginx.conf                    # Konfigurasi global
├── conf.d/
│   ├── security.conf             # Security headers global
│   ├── gzip.conf                 # Kompresi global
│   └── rate-limit.conf           # Zone rate limiting global
├── sites-available/
│   ├── myapp.conf                # Aplikasi utama
│   └── api.conf                  # API backend
├── sites-enabled/
│   └── myapp.conf -> ../sites-available/myapp.conf
└── snippets/
    ├── ssl-params.conf           # Snippet konfigurasi SSL
    ├── proxy-params.conf         # Snippet header proxy
    └── security-headers.conf     # Snippet security headers

Apa yang Membuat Konfigurasi Nginx “Baik” #

Konfigurasi Nginx yang baik memenuhi empat dimensi kualitas:

Benar (Correct): Melakukan apa yang dimaksudkan dan tidak ada lebih, tidak ada kurang. Typo dalam nama location block misalnya bisa membuat aturan keamanan tidak pernah aktif tanpa ada error sama sekali.

Aman (Secure): Tidak membuka celah security yang tidak perlu. Menyembunyikan versi Nginx (server_tokens off), membatasi ukuran request, mengatur timeout yang wajar.

Efisien (Efficient): Tidak melakukan pekerjaan yang tidak perlu. Cache file statis, compress response, gunakan keepalive ke backend.

Maintainable: Mudah dibaca dan dimodifikasi. Gunakan snippets untuk konfigurasi yang berulang, beri komentar pada bagian yang tidak intuitif, dan ikuti struktur direktori yang konsisten.

# Contoh konfigurasi yang memenuhi keempat dimensi:
server {
    listen 443 ssl;
    server_name example.com;

    # Benar: SSL dikonfigurasi dengan parameter yang tepat
    include snippets/ssl-params.conf;       # ← Maintainable: snippet

    # Aman: sembunyikan versi, batasi request
    server_tokens off;
    client_max_body_size 10m;

    # Efisien: cache file statis
    location ~* \.(css|js|png|jpg)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    location / {
        include snippets/proxy-params.conf;  # ← Maintainable
        proxy_pass http://backend;
    }
}

Sepanjang buku ini, kita akan selalu membangun konfigurasi yang memenuhi keempat dimensi ini.


Konvensi Penulisan di Buku Ini #

Beberapa konvensi yang digunakan di seluruh buku:

# Konfigurasi Nginx — blok kode berlabel "nginx"
server {
    listen 80;
    server_name example.com;
}
# Perintah terminal — blok kode berlabel "bash"
sudo nginx -t
# Diagram, pseudocode, atau output — blok kode tanpa label
Request → Nginx → Backend → Response

Anti-pattern selalu ditampilkan bersama solusinya dalam satu blok:

# ANTI-PATTERN: root di dalam location block
location / {
    root /var/www/html;  # ✗ Bermasalah untuk sub-location
}

# BENAR: root di level server block
server {
    root /var/www/html;  # ✓ Diwarisi semua location
    location / {
        try_files $uri $uri/ =404;
    }
}

Komunitas dan Sumber Belajar Tambahan #

Ketika menghadapi masalah yang tidak tercakup di buku ini:

Dokumentasi Resmi (nginx.org/en/): Sumber paling akurat. Jadikan referensi pertama untuk directive yang tidak dimengerti.

Stack Overflow: Tag nginx memiliki ribuan jawaban untuk masalah konfigurasi umum.

Mozilla SSL Configuration Generator (ssl-config.mozilla.org): Tool untuk menghasilkan konfigurasi SSL/TLS yang direkomendasikan.

GitHub — nginx/nginx: Untuk melaporkan bug atau melihat perubahan di versi terbaru.


Ringkasan #

  • Section Pengenalan membangun fondasi konseptual — urutan bacanya penting: Apa itu Nginx → Sejarah → Nginx vs Apache → Arsitektur.
  • Nginx bukan satu hal — ia bisa menjadi web server, reverse proxy, load balancer, API gateway, SSL terminator, dan HTTP cache sekaligus.
  • Tiga filosofi desain Nginx: efisiensi di atas segalanya, dapat diprediksi di bawah beban, dan konfigurasi sebagai kode.
  • Ekosistem Nginx mencakup Nginx Plus (komersial), OpenResty (Lua+Nginx), Nginx Ingress Controller (Kubernetes), dan ModSecurity (WAF).
  • Konfigurasi Nginx yang baik memenuhi empat dimensi: benar, aman, efisien, dan maintainable.
  • Lingkungan yang direkomendasikan: VPS atau VM Ubuntu 22.04 dengan Nginx 1.24+ (stable).
  • Fondasi konseptual mengubah kamu dari menghafal konfigurasi menjadi memahami mengapa konfigurasi itu ada.

Mulai Membaca: Apa itu Nginx? →

Nginx di Dunia Nyata: Angka dan Fakta #

Sebelum kamu mulai belajar, ada baiknya memahami seberapa luas Nginx digunakan. Ini bukan sekadar popularitas — angka-angka ini mencerminkan kepercayaan industri yang dibangun selama dua dekade.

Per 2024, Nginx digunakan oleh sekitar 34% dari seluruh website di internet yang bisa diidentifikasi web server-nya. Namun angka yang lebih relevan adalah pangsa di situs-situs besar: di antara satu juta website dengan trafik tertinggi di dunia, Nginx digunakan oleh lebih dari 60%. Artinya, situs-situs yang paling banyak dikunjungi justru paling banyak mengandalkan Nginx — bukan kebetulan.

Nginx di berbagai konteks (2024, perkiraan):

Seluruh web:              ~34% share
Top 1 juta website:       ~60%+ share
Docker Hub image nginx:   1+ miliar pulls
Kubernetes Ingress:       Nginx Ingress adalah yang paling populer

Digunakan oleh perusahaan besar:
  ✓ Netflix      — streaming platform global
  ✓ GitHub       — platform developer terbesar
  ✓ Airbnb       — marketplace akomodasi
  ✓ Dropbox      — cloud storage
  ✓ WordPress.com — platform blog terbesar
  ✓ DuckDuckGo   — search engine privacy-focused
  ✓ Cloudflare   — CDN dan security global
    (Cloudflare bahkan memodifikasi Nginx secara ekstensif
     untuk kebutuhan infrastruktur global mereka)

Yang menarik: Cloudflare — salah satu perusahaan infrastruktur terbesar di dunia — membangun banyak produknya di atas Nginx yang dimodifikasi (mereka menyebutnya “nginx-cloudflare”). Ini adalah bukti bahwa Nginx tidak hanya cocok untuk startup kecil, tapi untuk infrastruktur yang melayani miliaran request per hari.


Nginx vs Kompetitor Modern: Gambaran Singkat #

Ekosistem web server dan proxy modern lebih ramai dari sebelumnya. Berikut posisi Nginx di antara kompetitor utamanya:

Nginx vs Caddy #

Caddy (2015) adalah web server modern yang ditulis dalam Go. Keunggulan utamanya adalah automatic HTTPS — ia mengurus sertifikat Let’s Encrypt secara otomatis tanpa konfigurasi tambahan. Sintaksnya juga lebih sederhana dari Nginx.

# Caddyfile (Caddy)
example.com {
    reverse_proxy localhost:3000
}
# Selesai! HTTPS otomatis, reverse proxy aktif.

# Nginx equivalent membutuhkan lebih banyak konfigurasi,
# tapi jauh lebih fleksibel untuk kasus kompleks

Caddy unggul untuk: deployment sederhana yang butuh zero-config SSL, developer yang tidak mau repot dengan sertifikat. Nginx unggul untuk: konfigurasi kompleks, performa ekstrem, ekosistem yang lebih mature.

Nginx vs Traefik #

Traefik (2015) adalah proxy cloud-native yang dirancang khusus untuk Docker dan Kubernetes. Keunggulan utamanya adalah auto-discovery — ketika container baru di-deploy, Traefik otomatis mengkonfigurasi routing tanpa restart.

# Traefik: konfigurasi via label Docker
labels:
  - "traefik.enable=true"
  - "traefik.http.routers.myapp.rule=Host(`example.com`)"
  - "traefik.http.routers.myapp.tls=true"

Traefik unggul untuk: lingkungan container dinamis, Kubernetes dengan deployment sering. Nginx unggul untuk: workload stabil, performa tinggi, control penuh atas konfigurasi.

Nginx vs HAProxy #

HAProxy adalah load balancer dan proxy yang fokus pada performa ekstrem untuk use case load balancing murni. Ia tidak bisa melayani file statis (itu bukan tujuannya).

HAProxy: Spesialis load balancing TCP/HTTP
  ✓ Performa tertinggi untuk pure load balancing
  ✓ Algoritma load balancing yang sangat kaya
  ✗ Tidak bisa serve file statis
  ✗ Tidak bisa SSL termination yang fleksibel

Nginx: Generalis yang sangat baik
  ✓ Web server + reverse proxy + load balancer sekaligus
  ✓ Performa sangat baik untuk hampir semua use case
  ✓ Ekosistem dan dokumentasi yang jauh lebih besar

Nginx vs Envoy #

Envoy (2016, dikembangkan Lyft) adalah proxy layer 7 yang sangat powerful dan configurable. Ia digunakan sebagai data plane dalam service mesh Istio dan didesain untuk lingkungan microservice yang sangat kompleks.

Envoy: Power user proxy untuk microservice kompleks
  ✓ Observability kelas dunia (tracing, metrics built-in)
  ✓ Sangat configurable via API (tidak butuh reload)
  ✓ Ideal untuk service mesh
  ✗ Kurva belajar yang sangat curam
  ✗ Konfigurasi jauh lebih kompleks dari Nginx
  ✗ Overhead lebih tinggi untuk use case sederhana

Nginx: Pilihan default yang sangat baik
  ✓ Lebih mudah dikonfigurasi
  ✓ Ekosistem dan komunitas jauh lebih besar
  ✓ Cukup powerful untuk 99% use case web
Keputusan sederhana: kapan memilih apa

Nginx: Web server, reverse proxy, atau load balancer
       untuk hampir semua use case → pilih Nginx

Caddy: Kamu butuh zero-config HTTPS dan tidak perlu
       konfigurasi kompleks → pertimbangkan Caddy

Traefik: Kubernetes atau Docker Swarm dengan deployment
         dinamis yang sangat sering → pertimbangkan Traefik

HAProxy: Pure load balancing TCP dengan performa
         maksimal → pertimbangkan HAProxy

Envoy: Service mesh dan observability tingkat tinggi
       dalam arsitektur microservice sangat kompleks → Envoy

Untuk developer dan sysadmin yang baru mulai atau yang membangun sebagian besar aplikasi web: Nginx adalah titik awal yang tepat dan seringkali tidak perlu beralih ke yang lain.


Siklus Hidup Sebuah Request di Nginx #

Untuk memberikan gambaran yang lebih konkret tentang apa yang akan kamu pelajari sepanjang buku ini, berikut adalah perjalanan lengkap sebuah request HTTP melalui Nginx — dari koneksi masuk hingga respons dikirim:

Siklus Hidup Request di Nginx (detail):

1. PENERIMAAN KONEKSI
   ├── OS: paket TCP masuk, port 443
   ├── Nginx worker: accept() system call
   ├── Buat struktur koneksi baru (alokasi dari pool)
   └── Daftarkan ke event loop untuk baca data

2. TLS HANDSHAKE (jika HTTPS)
   ├── Kirim Server Hello + sertifikat
   ├── Negosiasi cipher suite
   ├── Kunci sesi dibuat
   └── Koneksi terenkripsi aktif

3. BACA REQUEST
   ├── Baca request line: "GET /api/users HTTP/1.1"
   ├── Baca headers: Host, User-Agent, Authorization, dll.
   ├── Validasi request format
   └── Parse URL, query string, dll.

4. COCOKKAN KONFIGURASI
   ├── Cari server block yang cocok (berdasarkan Host header)
   ├── Cari location block yang cocok (berdasarkan path)
   └── Tentukan tindakan: serve file, proxy, return, dll.

5. PROSES REQUEST (tergantung konfigurasi)
   ├── File statis: buka file, sendfile() ke socket
   ├── Proxy: buka koneksi ke backend, teruskan request
   ├── Return: kirim kode status + body langsung
   └── Rewrite: modifikasi URL, redirect

6. KIRIM RESPONS
   ├── Kirim status line: "HTTP/1.1 200 OK"
   ├── Kirim response headers
   ├── Kirim response body
   └── Catat ke access log

7. SELESAI
   ├── Keep-alive? → tunggu request berikutnya di koneksi yang sama
   └── Close? → tutup koneksi, bebaskan memori ke pool

Setiap langkah dalam siklus ini bisa dikonfigurasi dan dikustomisasi. Itulah mengapa Nginx begitu fleksibel — hampir setiap aspek dari siklus request ini bisa dimodifikasi melalui konfigurasi.


Preview: Apa yang Ada di Section-Section Berikutnya #

Setelah kamu menyelesaikan Section 01 ini, berikut adalah gambaran apa yang menanti:

Section 02 — Instalasi: Cara menginstal Nginx di Ubuntu, CentOS, Docker, dan compile dari source. Termasuk cara memverifikasi instalasi dan menjalankan Nginx pertama kali.

Section 03 — Konfigurasi Dasar: Fondasi sintaks Nginx — directive, context, server block, location block, dan variabel bawaan. Ini adalah section yang paling sering dirujuk ketika menulis konfigurasi.

Section 04 — Web Server: Menggunakan Nginx sebagai web server murni — melayani file statis, virtual host, root vs alias, directory listing, dan custom error page.

Section 05 — Reverse Proxy: Konfigurasi proxy_pass, mengelola proxy headers, buffer dan timeout, serta proxy cache.

Section 06 — Load Balancer: Algoritma load balancing (round-robin, least connection, IP hash, weighted), dan health check untuk mendeteksi server yang down.

Section 07 — SSL/TLS: Konfigurasi HTTPS dari dasar hingga advanced — self-signed cert, Let’s Encrypt, optimasi SSL, dan HTTP/2.

Section 08 — Keamanan: Basic auth, rate limiting, pembatasan IP, proteksi DoS, dan security headers.

Section 09 — Logging: Format log kustom, log rotation, dan menganalisis log untuk debugging.

Section 10 — Performa: Worker process tuning, gzip compression, caching, keepalive, dan open file cache.

Section 11 — Modul: Modul bawaan, ngx_lua/OpenResty, modul pihak ketiga, dan dynamic modules.

Section 12 — Studi Kasus: Konfigurasi nyata untuk Node.js, PHP-FPM, Python (Gunicorn), WebSocket, dan SPA.

Section 13 — Troubleshooting: Error umum, cara debug konfigurasi, tools diagnostik, dan best practices.

Ini adalah perjalanan yang komprehensif dari fondasi hingga production-ready. Mari mulai.

Membangun Mental Model yang Benar #

Sebelum membaca artikel pertama, ada satu mental model yang sangat membantu: bayangkan Nginx sebagai penjaga gerbang yang sangat cerdas di depan gedung (server aplikasimu).

Penjaga ini:

  • Memeriksa setiap tamu (request) yang datang
  • Memutuskan ke mana tamu harus pergi berdasarkan siapa mereka dan apa tujuan mereka
  • Bisa menolak tamu yang mencurigakan (rate limiting, IP blocking)
  • Bisa melayani kebutuhan sederhana sendiri (file statis) tanpa harus merepotkan orang di dalam gedung
  • Mencatat semua tamu yang datang dan pergi (access log)
  • Bisa menangani ribuan tamu sekaligus tanpa kewalahan

Konfigurasi Nginx pada dasarnya adalah “instruksi” yang kamu berikan kepada penjaga gerbang ini: apa yang harus dilakukan untuk setiap jenis tamu.

Dengan mental model ini, banyak direktif Nginx yang awalnya terasa abstrak akan mulai terasa masuk akal. server_name adalah cara penjaga mengenali untuk gedung mana ia bertugas. location adalah aturan “jika tamu mau ke bagian ini, lakukan ini.” proxy_pass adalah “arahkan tamu ini ke orang yang tepat di dalam gedung.”

Bawa mental model ini saat membaca artikel-artikel berikutnya — ia akan membuat semuanya jauh lebih intuitif.

Selamat belajar — mari mulai dengan pertanyaan paling mendasar: apa sebenarnya Nginx itu?

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact