Nginx + Unix Socket vs TCP Socket

Nginx + Unix Socket vs TCP Socket

Saat menghubungkan Nginx ke backend (PHP-FPM, app server, dsb), biasanya ada dua opsi:

  • Unix Domain Socket
  • TCP Socket (IP:Port)

Sering terdengar klaim:

“Unix socket pasti lebih cepat”

Jawaban yang benar:

  • Kadang iya
  • Kadang tidak
  • Dan sering kali beda tipis tapi efeknya kontekstual

Artikel ini membedah perbedaan nyata, kapan masing-masing lebih tepat, dan salah kaprah yang sering terjadi.


1. Apa Bedanya Secara Fundamental?

Unix Domain Socket

  • Berbasis filesystem
  • Tidak lewat TCP/IP stack
  • Contoh: /run/php/php-fpm.sock

TCP Socket

  • Lewat network stack
  • Bisa local (127.0.0.1) atau remote
  • Contoh: 127.0.0.1:9000

2. Mitos: Unix Socket Selalu Lebih Cepat

Secara teori:

  • Unix socket punya latency lebih rendah
  • Lebih sedikit context switch
  • Lebih sedikit overhead protocol

Secara praktik:

  • Selisih sering mikrodetik
  • Mudah kalah oleh:
    • Disk I/O
    • Buffering
    • App logic

➡️ Socket jarang jadi bottleneck utama.


3. Benchmark Realistis (Umum)

Di satu mesin:

MetodeLatency
Unix socket🟢 Paling rendah
TCP 127.0.0.1🟢 Hampir sama
TCP remote🔴 Lebih tinggi

Perbedaannya biasanya:

  • 1–5% saja

4. Kelebihan Unix Socket

1️⃣ Lebih Aman (Default)

  • Tidak bisa diakses lewat network
  • Tidak perlu firewall rule
  • Scope terbatas di host

Cocok untuk:

  • Nginx ↔ PHP-FPM di mesin yang sama

2️⃣ Lebih Sederhana untuk Single Host

Konfigurasi PHP-FPM:

listen = /run/php/php-fpm.sock

Nginx:

fastcgi_pass unix:/run/php/php-fpm.sock;

Tidak perlu:

  • Port management
  • Network debug

3️⃣ Lebih Stabil untuk Local IPC

Tidak tergantung:

  • Network stack
  • TCP backlog
  • SYN queue

5. Kekurangan Unix Socket (Sering Diabaikan)

❌ Permission = Sumber Masalah

Masalah klasik:

  • Nginx: user www-data
  • PHP-FPM: user php-fpm

Socket:

  • Tidak bisa diakses
  • Error 502

Solusi:

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

❌ Tidak Bisa Scale Antar Host

Unix socket:

  • Tidak bisa di-share ke mesin lain
  • Tidak bisa load balance multi-node

Jika ada rencana scale:

Unix socket = jalan buntu


6. Kelebihan TCP Socket

1️⃣ Mudah Scale

  • Bisa beda host
  • Bisa container
  • Bisa load balance

Contoh:

upstream php_backend {
    server 10.0.0.2:9000;
    server 10.0.0.3:9000;
}

2️⃣ Debug Lebih Familiar

Tool umum:

  • netstat
  • ss
  • tcpdump

Unix socket:

  • Lebih susah di-trace

3️⃣ Cocok untuk Docker / K8s

Container:

  • Isolasi filesystem
  • Unix socket ribet
  • TCP lebih natural

7. TCP 127.0.0.1 vs 0.0.0.0

Kesalahan umum:

listen = 0.0.0.0:9000

Masalah:

  • Terbuka ke network
  • Risiko security

Lebih aman:

listen = 127.0.0.1:9000

Atau:

  • Firewall ketat

8. Bottleneck Bukan di Socket (Sering Salah Fokus)

Jika latency tinggi:

  • 99% bukan karena socket
  • Tapi karena:
    • PHP lambat
    • Query lambat
    • Disk lambat
    • Buffer salah

Ganti socket tidak menyembuhkan aplikasi lambat.


9. Timeout & Backlog Tetap Penting

Baik Unix maupun TCP:

  • Bisa kehabisan backlog
  • Bisa drop connection

Perhatikan:

  • listen.backlog
  • pm.max_children
  • fastcgi_connect_timeout

10. Kapan Pakai Unix Socket?

Gunakan Unix socket jika:

  • Nginx & backend satu mesin
  • Tidak ada rencana scale horizontal
  • Ingin setup sederhana
  • Security minimal effort

11. Kapan Pakai TCP Socket?

Gunakan TCP socket jika:

  • Backend beda host
  • Containerized
  • Load balancing
  • High availability

12. Kesalahan Fatal yang Sering Terjadi

  1. Pakai Unix socket lalu scale ke multi-host ❌
  2. Permission socket dibiarkan default ❌
  3. TCP listen ke 0.0.0.0 tanpa firewall ❌
  4. Mengira socket tuning = performance tuning ❌

13. Kesimpulan

Unix socket vs TCP socket bukan soal:

mana yang lebih cepat

Tapi soal:

mana yang paling sesuai dengan arsitektur

Kalimat paling jujur:

Pilih socket yang membuat sistem Anda lebih sederhana, bukan lebih “keren”.