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. Saya belajar tuning Nginx dengan cara yang sulit ketika peluncuran produk di Commsult Indonesia mengirim lonjakan traffic yang menjatuhkan instance Nginx yang belum di-tune.
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.
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.
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 saya menyetel Nginx di DigitalOcean Droplet untuk Commsult Indonesia, peningkatan performa tunggal terbesar 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 meningkatkan throughput berkelanjutan kami di bawah beban burst sekitar 40%.
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.
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.comTLS 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.
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 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.