Cara Mengatur Child Processes untuk PHP-FPM di Nginx Server

Saturday, January 27, 2018

Cara Mengatur Child Processes untuk PHP-FPM di Nginx Server - Menggunakan web server Nginx tentu bertujuan agar resource yang dibutuhkan oleh web server lebih hemat dan juga performa lebih stabil. Namun jika konfigurasinya salah, web server akan berjalan dengan tidak normal dan tidak menutup kemungkinan bakal sering down.
Pada tutorial ini saya akan sharing bagaimana cara mengatur child process php-fpm. Mengatur disini adalah memberi angka yang sesuai, dan mengoptimalkan resource yang ada.
Konfigurasi default child process php-fpm ada di file www.conf yang terletak di /etc/php/versi.php/fpm/pool/

Dalam penggunakan php-fpm, ada namanya value pm.max_children yaitu jumlah maksimal child proses yang dapat kita atur. Cara paling ideal untuk mengaturnya adalah dengan menghitung alokasi memory total. Mungkin lebih gampang kalau saya kasih contoh langsung.
Dalam contoh ini saya menggunakan VPS dengan RAM 24GB atau 24000MB. Nah, cara menghitung pm.max_children adalah:

jumlah total RAM dibagi dengan rata-rata penggunaan memory per proses php-fpm. Cara cek rata rata penggunaan memory oleh php-fpm adalah:
ps -C php-fpm7.1 -o rss=
Silahkan sesuaikan sendiri dengan versi php-fpm yang kalian gunakan. Contoh output :
79308
97544
84632
86120
82404
74964
75884
81188
86588
Angka tersebut adalah angka yang menunjukkan penggunaan memory oleh proses php-fpm dalah kilobytes. Oke dari data diatas kita ambil nilai 90000KB atau 90MB. Kita ambil perkiraan saja karena tentu proses nya tidak akan terus menerus memakan jumlah itu. Oke berarti:
mem total/singe process = 24000MB/90MB = 266 max_children
Ya tentu saja jangan kita ambil nilai maksimal tersebut karena kita juga harus memikirkan service atau layanan lain yang menggunakan memory seperti nginx mysql database serta service lain yang berjalan. Disini saya ambil aman saja pm max_children=200 .

Mengatur Child Processes untuk PHP-FPM di Nginx Server

Dalam penggunaan php-fpm, ada tiga jenis process management yang dapat digunakan yaitu static, dynamic, dan ondemand. 

Static
Inilah yang sering saya gunakan. Intinya, semua child process langsung dipanggil saat service php-fpm berjalan. Jadi misal kalian mengatur jumlah max_children sebanyak 200 proses, maka 200 proses tersebut langsung akan berjalan bersamaan meski tidak ada pengunjung atau aktifitas di web server. Kelebihannya tentu saja kita lebih memaksimalkan alokasi RAM untuk php-fpm. 
Contoh konfigurasi:
pm = static
pm.max_children = 200
Yup, yang dibutuhkan process management static hanya pm.max_children. Konfigurasi ini cocok untuk situs dengan jumlah pengunjung online yang banyak dan server dengan resource besar karena dengan men-set process management ke static, pengunjung tidak perlu menunggu child process pp-fpm dipanggil ketika jumlah pengunjung bertambah.

Dynamic
Banyak situs situs yang menyanrankan pembaca menggunakan ini. Bahkan banyak yang cuma copas konfigurasi tanpa paham konsep *lol. Oke, konfigurasi ini adalah yang paling populer digunakan. Cara kerjanya, jumlah proses akan ditentukan secara dinamis berdasarkan konfigurasi yang diatur.
Contoh konfiurasi:
pm.max_children = 200 # jumlah proses maksimal yang diijinkan
pm.start_servers = 50 # jumlah proses yang akan langsung berjalan ketika service php-fpm dijalankan.
pm.min_spare_servers = 50 # jumlah proses cadangan yang akan dibuat
pm.max_spare_servers = 80 # jumlah proses cadangan maksimal (waiting for connections) yang diijinkan.
Kasarnya, proses hanya akan dipanggil ketika dibutuhkan saja.  Konfigurasi ini cocok untuk web dengan jumlah visitor medium.

Ondemand
Ini adalah manajemen proses yang paling "ekstrim" dalam menghemat memory. Cara kerjanya hampir sama dengan dynamic hanya saja proses hanya akan dipanggil saat dibutuhkan tanpa ada jumlah proses yang akan langsung berjalan saat php-fpm dijalankan. jadi jika ada dua request maka hanya akan ada dua proses php-fpm yang berjalan saja.
Berikut contoh konfigurasinya:
pm = ondemand
pm.max_children = 200
pm.process_idle_timeout = 15s
pm.max_requests = 100
Yup, tidak perlu mengatur pm.start_servers dll. pm.process_idle_timeout digunakan untuk mengatur proses kill ketika service sudah tidak digunakan. Dari contoh diatas, ketika proses yang terpanggil sudah tidak aktif selama 15detik maka proses akan di kill. Untuk website, saya kira 15detik adalah waktu yang ideal.
Konfigurasi ini cocok untuk pemilik webserver dengan memory kecil dan berencana untuk menghemat memory nya. Namun untuk situs dengan jumlah pengunjung online yang besar dan membutuhkan performa tinggi, konfigurasi ini tidak cocok untukmu.


Kesimpulan

Ada banyak pilihan untuk mengatur process management di php-fpm. Semuanya dapat digunakan sesuai kebutuhan.

Baiklah sekian tutorial kali ini, jika ada yang kurang jelas silahkan ditanyakan.

Artikel Terkait Nginx ,PHP-FPM ,Server

1 comment: