Dalam arsitektur web modern yang menggunakan NGINX + PHP-FPM + MySQL, bottleneck paling sering terjadi di PHP-FPM dan database.
Salah satu penyebab utama server:
- CPU 100%
- RAM habis
- muncul error 502
π adalah konfigurasi pm.max_children yang tidak sesuai kapasitas RAM.
Contents
- 1 βοΈ Cara Kerja PHP-FPM (Singkat)
- 2 π Rumus Dasar Perhitungan
- 3 π§Ύ Standar Konfigurasi
- 4 π’ 1. RAM 2 GB (Server kecil / VPS murah)
- 5 π’ 2. RAM 3 GB
- 6 π’ 3. RAM 4 GB
- 7 π’ 4. RAM 6 GB
- 8 π’ 5. RAM 16 GB (Server besar / production)
- 9 β οΈ Catatan Penting
- 10 β MySQL tetap faktor utama
- 11 β Gunakan caching (WAJIB untuk performa)
- 12 π Setelah Ubah Konfigurasi
- 13 π Monitoring Setelah Optimasi
- 14 π§ Kesimpulan
- 15 Related Posts
βοΈ Cara Kerja PHP-FPM (Singkat)
Mode:
pm = dynamic
Artinya:
- PHP-FPM akan membuat worker sesuai kebutuhan
- Tapi tetap dibatasi oleh
pm.max_children
π Setiap child process mengkonsumsi RAM (Β±20β50MB)
π Rumus Dasar Perhitungan
Gunakan pendekatan aman:
max_children = (Total RAM - kebutuhan MySQL - OS) / rata-rata memory per PHP process
Asumsi umum:
- OS + service lain: 300β500MB
- MySQL: 500MBβ1GB (tergantung beban)
- 1 PHP process: Β±30β50MB
π§Ύ Standar Konfigurasi
Konfigurasi ini contoh aplikasi pada php versi 7.4 , buka dengan ssh linux vps
nano /etc/php/7.4/fpm/pool.d/www.conf
Ini template dasar yang akan kita sesuaikan:
pm = dynamic
pm.max_children = X
pm.start_servers = Y
pm.min_spare_servers = Z
pm.max_spare_servers = A
pm.max_requests = 300
π’ 1. RAM 2 GB (Server kecil / VPS murah)
pm = dynamic
pm.max_children = 8
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 4
pm.max_requests = 300
π Cocok untuk:
- Website kecil
- WordPress ringan
- Traffic rendah
π’ 2. RAM 3 GB
pm = dynamic
pm.max_children = 12
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6
pm.max_requests = 300
π Rekomendasi terbaik config ram 3GB (sudah cukup ideal π)
π’ 3. RAM 4 GB
pm = dynamic
pm.max_children = 16
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 8
pm.max_requests = 300
π Cocok untuk:
- Website bisnis
- Traffic sedang
π’ 4. RAM 6 GB
pm = dynamic
pm.max_children = 24
pm.start_servers = 6
pm.min_spare_servers = 4
pm.max_spare_servers = 10
pm.max_requests = 300
π Cocok untuk:
- High traffic
- API backend
π’ 5. RAM 16 GB (Server besar / production)
pm = dynamic
pm.max_children = 60
pm.start_servers = 10
pm.min_spare_servers = 6
pm.max_spare_servers = 20
pm.max_requests = 500
π Cocok untuk:
- High concurrency
- SaaS / aplikasi besar
β οΈ Catatan Penting
β Jangan terlalu besar – Contoh salah:
pm.max_children = 60 (di RAM 2GB)
π Ini akan menyebabkan:
- RAM habis
- swap aktif
- CPU 100%
- 502 Bad Gateway
β MySQL tetap faktor utama
Walaupun PHP-FPM sudah optimal, kalau:
- query lambat
- tidak ada index
π tetap akan bottleneck di MySQL
β Gunakan caching (WAJIB untuk performa)
Rekomendasi:
- Redis
- FastCGI cache di NGINX
π Setelah Ubah Konfigurasi
Jangan lupa restart:
systemctl restart php7.4-fpm
systemctl restart nginx
π Monitoring Setelah Optimasi
Gunakan:
htop
Perhatikan:
- CPU stabil (<70%)
- RAM tidak penuh
- jumlah php-fpm tidak berlebihan
π§ Kesimpulan
π Kunci stabilitas server bukan βbesar angkaβ, tapi proporsional dengan RAM
Lebih baik:
- sedikit worker tapi stabil β
daripada: - banyak worker tapi crash β