10 Step Tuning Nginx Cepat dan Stabil

Nginx memang terkenal cepat, tapi default configuration tidak selalu optimal, terutama di production dengan traffic tinggi atau backend yang lambat.

Berikut panduan 10 langkah tuning Nginx lengkap, dengan contoh nyata, jebakan yang harus dihindari, dan tips monitoring.


1️⃣ Worker Processes dan Worker Connections

Penjelasan

  • worker_processes menentukan jumlah worker process (event loop non-blocking).
  • worker_connections menentukan berapa koneksi simultan tiap worker dapat handle.

Rumus kasar kapasitas maksimum:

max_connections ≈ worker_processes × worker_connections

Contoh konfigurasi

worker_processes auto;      # mulai dengan auto, lalu tweak jika perlu
worker_rlimit_nofile 65535; # buka limit file descriptors cukup tinggi

events {
    worker_connections 8192; # per worker
    multi_accept on;         # terima banyak koneksi sekaligus
    use epoll;               # Linux spesifik, lebih cepat dari select
}

Kesalahan umum

  • Terlalu banyak worker → context switch tinggi
  • Worker terlalu sedikit → max connections cepat habis

Tip

  • Mulai dengan auto
  • Monitor active connections → tweak sesuai kebutuhan

2️⃣ Sendfile dan TCP Optimizations

Untuk melayani file statis, optimasi TCP dan I/O sangat krusial.

sendfile on;
tcp_nopush on;   # gabungkan packet agar lebih efisien
tcp_nodelay on;  # kirim packet segera, tanpa delay
  • sendfile → mengirim file langsung dari kernel → RAM → socket tanpa copy ke user space
  • tcp_nopush → hindari packet fragmentasi
  • tcp_nodelay → low latency untuk koneksi kecil

Kesalahan umum

  • Tidak aktifkan → static file lebih lambat
  • Kombinasi buffer default yang terlalu kecil → sering I/O block

3️⃣ Buffer Tuning (Proxy & FastCGI)

Nginx memakai buffer untuk menyimpan response upstream. Buffer default sering tidak cukup untuk trafik tinggi, menyebabkan worker block.

Proxy Buffer

proxy_buffers 16 16k;
proxy_buffer_size 16k;
proxy_busy_buffers_size 32k;

FastCGI Buffer

fastcgi_buffers 16 16k;
fastcgi_buffer_size 16k;
fastcgi_busy_buffers_size 32k;
fastcgi_connect_timeout 5s;
fastcgi_send_timeout 30s;
fastcgi_read_timeout 30s;

Kesalahan umum

  • Buffer terlalu kecil → backend sering menunggu → latency naik
  • Buffer terlalu besar → RAM terbuang sia-sia

4️⃣ Microcaching / Cache Response

Untuk dynamic content read-heavy yang bisa di-cache 1–5 detik, microcaching sangat efektif.

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=microcache:100m max_size=10g inactive=1m use_temp_path=off;

location /api/ {
    proxy_cache microcache;
    proxy_cache_valid 200 5s;
    proxy_cache_key "$scheme$request_method$host$request_uri";
    proxy_cache_lock on;         # hindari cache stampede
    proxy_cache_lock_timeout 5s;
}

Efek

  • Mengurangi load backend
  • Menjaga latency tetap rendah
  • Sangat efektif untuk homepage, API, feed, dashboard read-heavy

5️⃣ Rate Limiting & Connection Limit

Lindungi server dari spike traffic atau abuse.

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

server {
    location /api/ {
        limit_req zone=api burst=10 nodelay;
    }
}
  • limit_req → request per IP
  • burst → toleransi sementara
  • nodelay → langsung throttle
  • Berguna untuk API publik, login, search endpoint

Kesalahan umum

  • Rate limit tanpa burst → user sah ditolak
  • Tidak pakai $binary_remote_addr → memory lebih boros

6️⃣ Real IP Module (Docker / NAT)

Jika Nginx berada di balik proxy / Docker / load balancer, $remote_addr default = proxy. Untuk rate limit, logging, dan security, perlu update dengan ngx_http_realip_module.

http {
    real_ip_header X-Forwarded-For;
    set_real_ip_from 172.18.0.0/16; # subnet trusted Docker
    real_ip_recursive on;
}

Kesalahan umum

  • Tidak menambahkan set_real_ip_from → semua IP = proxy
  • real_ip_recursive off → hanya ambil IP terakhir, bukan client asli

7️⃣ Logging Optimization

  • Log default bisa menambah overhead CPU & I/O, terutama untuk file statis.
location ~* \.(css|js|png|jpg|gif|ico)$ {
    access_log off;
    expires 30d;
}
  • Gunakan log_format custom untuk debug atau metrics
  • Hanya log hal penting → RAM dan I/O lebih hemat

8️⃣ Error Handling Tanpa Backend

  • Gunakan try_files untuk SPA atau fallback:
location / {
    try_files $uri /index.html;
}
  • Gunakan error_page untuk maintenance:
error_page 503 /maintenance.html;

User tetap mendapatkan response walau backend down, tanpa PHP/Node menjalankan apapun


9️⃣ Timeout & Keepalive Tuning

client_body_timeout 10s;
client_header_timeout 10s;
send_timeout 10s;

keepalive_timeout 15s;
keepalive_requests 100;
  • Mencegah slow client menahan worker
  • Mengurangi resource waste pada koneksi idle

Kesalahan umum

  • Timeout terlalu panjang → worker terjebak slow client
  • Timeout terlalu pendek → legitimate request terputus

🔟 Monitoring & Auto-Tuning

Monitoring adalah kunci tuning nyata.

  • stub_status module → active connections, reading, writing, waiting
  • Logs → 499, 502, 504 errors
  • Metrics → latency, throughput

Contoh stub_status:

location /nginx_status {
    stub_status on;
    allow 127.0.0.1;
    deny all;
}
  • Gunakan hasil monitoring → tweak:
    • worker_processes
    • worker_connections
    • buffer
    • timeout
  • Tanpa monitoring → tuning buta

Bonus: Tips Advanced

  1. Gunakan map directive untuk cache bypass, A/B testing, conditional headers
  2. Gunakan Unix socket untuk backend satu host → latency rendah
  3. Gunakan TCP socket untuk multi-host / containerized setup
  4. Gunakan microcaching + buffer tuning → sering lebih efektif daripada scale-out server
  5. Gunakan proxy_cache_lock untuk menghindari cache stampede

Kesimpulan

Nginx cepat, tapi bukan magic.

10 langkah ini membantu:

  1. Worker processes & connections
  2. Sendfile & TCP optimizations
  3. Buffer tuning
  4. Microcaching
  5. Rate limiting
  6. Real IP module
  7. Logging optimization
  8. Error handling tanpa backend
  9. Timeout & keepalive tuning
  10. Monitoring & auto-tuning

Kalimat inti:

Nginx cepat & stabil bukan default, tapi achievable dengan konfigurasi cerdas, buffer tepat, cache bijak, dan monitoring real-time.