Keepalive

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 N di upstream) jauh lebih berdampak — mencegah pembukaan koneksi TCP baru untuk setiap request.
  • Dua directive wajib untuk keepalive ke backend: proxy_http_version 1.1 dan proxy_set_header Connection "" — tanpa ini keepalive tidak bekerja.
  • Nilai keepalive yang tepat tergantung traffic: mulai dari 32 dan naikkan jika banyak TIME_WAIT di monitoring koneksi.
  • Untuk PHP-FPM, gunakan fastcgi_keep_conn on alih-alih proxy keepalive.

← Sebelumnya: Caching   Berikutnya: Open File Cache →

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