Keepalive #
Setiap kali koneksi TCP dibuka, ada proses handshake yang membutuhkan beberapa round-trip. Untuk aplikasi web modern yang memuat puluhan resource, membuka koneksi baru untuk setiap resource sangat tidak efisien. Keepalive memungkinkan koneksi TCP yang sama digunakan kembali untuk banyak request.
Keepalive ke Klien #
Keepalive ke klien mengontrol berapa lama Nginx mempertahankan koneksi TCP terbuka dengan browser setelah request selesai:
http {
# Berapa lama Nginx mempertahankan koneksi idle dengan klien
keepalive_timeout 65s;
# Jumlah request maksimum dalam satu koneksi keepalive
# Setelah ini, koneksi ditutup dan klien perlu buka koneksi baru
keepalive_requests 1000;
# Kirim header Keep-Alive dengan timeout ke klien
# Berguna untuk klien yang menghormati nilai ini
keepalive_time 1h;
}
Nilai 65s untuk keepalive_timeout adalah default yang wajar. Terlalu panjang (misalnya 120s) bisa menghabiskan worker connections dengan koneksi idle. Terlalu pendek memaksa terlalu banyak handshake TCP.
Keepalive ke Upstream Backend #
Ini yang lebih sering diabaikan dan berdampak signifikan pada performa: koneksi keepalive antara Nginx dan backend server.
Tanpa keepalive ke backend, Nginx membuka koneksi TCP baru ke backend untuk setiap request — overhead yang signifikan untuk aplikasi dengan traffic tinggi.
upstream app_backend {
server 10.0.0.1:3000;
server 10.0.0.2:3000;
# Pertahankan hingga 32 koneksi idle ke setiap upstream server
keepalive 32;
# Waktu maksimum koneksi keepalive ke backend dipertahankan
keepalive_timeout 60s;
# Jumlah request per koneksi sebelum koneksi ditutup dan diganti
keepalive_requests 100;
}
server {
location / {
proxy_pass http://app_backend;
# WAJIB: gunakan HTTP/1.1 untuk keepalive ke backend
# HTTP/1.0 tidak mendukung keepalive secara default
proxy_http_version 1.1;
# WAJIB: hapus header Connection dari request klien
# Nginx akan mengelola keepalive ke backend sendiri
proxy_set_header Connection "";
proxy_set_header Host $host;
}
}
Dua baris terakhir (proxy_http_version 1.1 dan proxy_set_header Connection "") adalah wajib untuk keepalive ke backend bekerja dengan benar. Tanpa ini, Nginx tetap membuka koneksi baru untuk setiap request meski keepalive sudah dikonfigurasi.
Berapa Nilai keepalive yang Tepat #
keepalive N di upstream block berarti:
Nginx mempertahankan hingga N koneksi idle ke setiap server backend.
Bukan total — ini per server.
Contoh: 2 backend server, keepalive=32:
Koneksi idle ke server 1: hingga 32
Koneksi idle ke server 2: hingga 32
Total koneksi idle: hingga 64
Pedoman nilai:
Traffic rendah (< 100 req/s): keepalive 8
Traffic sedang (100-1000 req/s): keepalive 32
Traffic tinggi (> 1000 req/s): keepalive 64-128
Nilai yang terlalu tinggi menghabiskan koneksi di sisi backend tanpa manfaat proporsional. Backend memiliki batas koneksi (misalnya Node.js dengan maxConnections, atau PostgreSQL dengan max_connections).
Keepalive untuk Koneksi ke FastCGI / PHP-FPM #
Untuk backend PHP-FPM (FastCGI), keepalive dikonfigurasi berbeda:
upstream php_fpm {
server unix:/run/php/php8.2-fpm.sock;
keepalive 16;
}
server {
location ~ \.php$ {
fastcgi_pass php_fpm;
fastcgi_keep_conn on; # Aktifkan keepalive untuk FastCGI
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Memverifikasi Keepalive Berfungsi #
# Cek koneksi ke backend — ESTABLISHED yang banyak dan TIME_WAIT yang sedikit
# menunjukkan keepalive bekerja dengan baik
ss -tn | grep :3000
# Tanpa keepalive: banyak TIME_WAIT (koneksi baru dibuka lalu ditutup)
# Dengan keepalive: lebih sedikit TIME_WAIT, banyak ESTABLISHED
# Monitor status koneksi
watch -n 2 'ss -tn | grep :3000 | awk "{print \$1}" | sort | uniq -c'
Ringkasan #
- Keepalive ke klien (
keepalive_timeout) mempertahankan koneksi browser — nilai 65 detik adalah default yang baik.- Keepalive ke backend (
keepalive Ndi upstream) jauh lebih berdampak — mencegah pembukaan koneksi TCP baru untuk setiap request.- Dua directive wajib untuk keepalive ke backend:
proxy_http_version 1.1danproxy_set_header Connection ""— tanpa ini keepalive tidak bekerja.- Nilai
keepaliveyang tepat tergantung traffic: mulai dari 32 dan naikkan jika banyakTIME_WAITdi monitoring koneksi.- Untuk PHP-FPM, gunakan
fastcgi_keep_conn onalih-alih proxy keepalive.