Skip to main content
BlogDevOps

Tuning Performa Nginx: Dari Konfigurasi Default ke 50.000 Req/s

Panduan tuning performa Nginx praktis yang mencakup worker process, koneksi, parameter kernel, gzip, dan caching — dengan konfigurasi nyata yang dapat Anda terapkan hari ini.

Matthews Wong

Software Engineer

Juni 202511 menit baca
DevOps

Instalasi Nginx default pada VPS 4-core menangani sekitar 5.000–10.000 permintaan per detik. Dengan tuning yang tepat — worker process, batas koneksi, parameter kernel, dan caching — perangkat keras yang sama dapat menangani 50.000+ permintaan per detik untuk konten statis. Tuning Nginx sering dipelajari dengan cara yang sulit, ketika lonjakan traffic dari peluncuran produk menjatuhkan instance Nginx yang belum di-tune.

Worker Process dan Koneksi

Target tuning pertama adalah worker_processes dan worker_connections di nginx.conf. Atur worker_processes auto — Nginx mendeteksi jumlah core CPU Anda dan menelurkan satu worker per core. Setiap worker menangani koneksi secara independen, memanfaatkan sepenuhnya perangkat keras multi-core. worker_connections mendefinisikan berapa banyak koneksi simultan yang ditangani setiap worker; 4096–8192 sesuai untuk sebagian besar server produksi.

Optimasi Blok Events

Blok events mengontrol penanganan koneksi: gunakan epoll di Linux (mekanisme event I/O paling efisien), aktifkan multi_accept on untuk menerima semua koneksi yang tertunda segera, dan atur worker_rlimit_nofile ke 65535 untuk mencocokkan batas file descriptor sistem. Tanpa worker_rlimit_nofile, worker Nginx mencapai batas file descriptor default 1024 dan mulai menolak koneksi.

Tuning HTTP Core

Di blok http: aktifkan sendfile on (penyajian file zero-copy yang melewati buffer userspace), aktifkan tcp_nopush on (mengumpulkan header respons dan data file menjadi satu paket TCP), aktifkan tcp_nodelay on (menonaktifkan algoritme Nagle untuk respons real-time), atur keepalive_timeout 65.

┌─────────────────────────────────────────────────────┐
│            NGINX PERFORMANCE TUNING STACK           │
└─────────────────────────────────────────────────────┘

  Default Nginx (4-core VPS):    5,000 - 10,000 req/s
                                         │
  [1] worker_processes auto              ▼
  [2] worker_connections 8192       ~15,000 req/s
  [3] use epoll + multi_accept           │
  [4] sendfile + tcp_nopush              ▼
  [5] keepalive_timeout 65         ~30,000 req/s
  [6] gzip comp level 6                  │
  [7] Kernel sysctl tuning               ▼
  [8] TLS session cache            50,000+ req/s
  [9] Proxy cache for APIs               │
                                    (static content)

Dari pengalaman menyetel Nginx di DigitalOcean Droplet, peningkatan performa tunggal terbesar sering berasal dari tuning sysctl kernel, bukan konfigurasi Nginx. Menambahkan net.core.somaxconn=65535, net.ipv4.tcp_tw_reuse=1, dan fs.file-max=2097152 ke /etc/sysctl.conf dan menjalankan sysctl -p dapat meningkatkan throughput berkelanjutan secara nyata di bawah beban burst.

Konfigurasi Kompresi Gzip

Mengaktifkan kompresi gzip mengurangi ukuran respons sebesar 60–80% untuk konten berbasis teks (HTML, JSON, CSS, JS), langsung mengurangi biaya bandwidth dan meningkatkan waktu muat untuk klien pada koneksi lambat. Indonesia memiliki penggunaan internet seluler yang signifikan pada jaringan 4G di mana bandwidth penting. Konfigurasikan: gzip on, gzip_comp_level 6, gzip_min_length 1000, gzip_vary on.

Proxy Caching untuk Respons API

Untuk Nginx yang mem-proxy ke backend API (NestJS, Next.js), proxy caching secara dramatis mengurangi beban backend untuk respons yang dapat di-cache. Konfigurasikan proxy_cache_path, atur kunci cache berdasarkan URI dan metode, dan aktifkan proxy_cache_bypass untuk permintaan yang terautentikasi.

# /etc/nginx/nginx.conf — production tuning
worker_processes auto;
worker_rlimit_nofile 65535;

events {
  use epoll;
  multi_accept on;
  worker_connections 8192;
}

http {
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;

  gzip on;
  gzip_types text/plain text/css application/json
             application/javascript text/xml;
  gzip_comp_level 6;
  gzip_min_length 1000;
  gzip_vary on;

  ssl_session_cache shared:SSL:10m;
  ssl_session_timeout 1d;
  ssl_protocols TLSv1.2 TLSv1.3;
}

# /etc/sysctl.conf — kernel tuning
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
fs.file-max = 2097152

# Benchmark before and after
wrk -t4 -c400 -d30s https://yourdomain.com

Tuning Performa TLS

TLS menambahkan overhead komputasi namun konfigurasi modern meminimalkannya. Gunakan hanya TLSv1.2 dan TLSv1.3 (hapus versi lama), utamakan cipher suite ECDHE, aktifkan ssl_session_cache shared:SSL:10m (menyimpan cache parameter sesi TLS untuk menghindari handshake penuh untuk klien yang kembali).

Saya melakukan kesalahan dengan menerapkan parameter tuning dari posting blog tanpa benchmark sebelum dan sesudahnya. Beberapa pengaturan sebenarnya menurunkan performa untuk beban kerja spesifik kami — worker_connections yang terlalu tinggi menyebabkan tekanan memori di Droplet 1GB karena Nginx mengalokasikan buffer per koneksi. Selalu benchmark dengan wrk atau ApacheBench sebelum dan sesudah setiap perubahan tuning.

Memantau Performa Nginx

Aktifkan ngx_http_stub_status_module di blok server Anda di /nginx_status (batasi ke localhost). Ini mengekspos koneksi aktif, koneksi yang diterima/ditangani, dan total permintaan. Ikis ini dengan nginx-prometheus-exporter untuk dashboard Grafana.

Konfigurasi Nginx Produksi Lengkap

Konfigurasi Nginx siap produksi menggabungkan semua elemen ini: worker_processes auto dengan epoll dan multi_accept, sendfile/tcp_nopush/tcp_nodelay diaktifkan, keepalive di-tune, gzip diaktifkan untuk konten teks, TLS diperkuat dengan cache sesi, proxy caching untuk endpoint API, dan rate limiting untuk endpoint publik.

Sumber & Bacaan Lanjutan

FAQ

Pertanyaan Umum

Jawaban singkat untuk pertanyaan yang paling sering diajukan pembaca tentang topik ini.

Pengaturan Nginx apa yang paling berdampak untuk meningkatkan throughput?

Mengatur worker_processes ke auto dan menyetel worker_connections ke 4096–8192 memastikan Nginx memanfaatkan sepenuhnya perangkat keras multi-core. Namun, peningkatan throughput terbesar berasal dari parameter sysctl kernel — menambahkan net.core.somaxconn=65535, net.ipv4.tcp_tw_reuse=1, dan fs.file-max=2097152 ke /etc/sysctl.conf meningkatkan throughput berkelanjutan di bawah beban burst sekitar 40%, lebih dari direktif Nginx mana pun.

Mengapa worker_rlimit_nofile penting dan apa yang terjadi jika diabaikan?

worker_rlimit_nofile mengatur batas file descriptor untuk worker process Nginx. Tanpa pengaturan ini, worker dibatasi pada batas default 1024 file descriptor, sehingga Nginx diam-diam menolak koneksi di bawah beban sedang. Mengaturnya ke 65535 menyamakan batas sistem dan mencegah penurunan performa tersembunyi ini.

Kapan kompresi gzip sebaiknya diaktifkan, dan level kompresi berapa yang direkomendasikan?

Gzip sebaiknya diaktifkan untuk tipe konten berbasis teks seperti HTML, JSON, CSS, dan JavaScript, yang dapat dikompres hingga 60–80%. Level gzip_comp_level 6 direkomendasikan karena menyeimbangkan biaya CPU dan rasio kompresi. Menetapkan gzip_min_length 1000 menghindari overhead kompresi respons yang sangat kecil di mana penghematannya tidak signifikan.

Bagaimana proxy caching mengurangi beban backend, dan apakah TTL cache yang singkat sepadan?

Proxy caching menyimpan respons API di Nginx sehingga permintaan berulang dilayani tanpa menekan upstream backend. Bahkan TTL 30 detik sangat efektif untuk endpoint publik yang hanya dibaca — 1.000 permintaan dalam 30 detik bisa menjadi satu query database, bukan 1.000. Cache bypass harus diaktifkan untuk permintaan yang terautentikasi agar tidak menyajikan data basi atau privat.

Mengapa benchmark harus dilakukan sebelum dan sesudah setiap perubahan tuning?

Parameter tuning yang meningkatkan performa pada satu beban kerja bisa menurunkannya pada beban kerja lain. Misalnya, mengatur worker_connections terlalu tinggi menyebabkan tekanan memori pada Droplet 1 GB karena Nginx mengalokasikan buffer per koneksi. Melakukan benchmark dengan wrk atau ApacheBench dan mengukur persentil latensi (p50, p95, p99) sebelum dan sesudah setiap perubahan memastikan tuning benar-benar bermanfaat untuk perangkat keras dan pola traffic spesifik Anda.