PHP-FPM [atau Fast Process Manager] menawarkan beberapa keunggulan dibandingkan mod_php, dengan dua yang paling menonjol adalah lebih fleksibel untuk dikonfigurasi dan saat ini merupakan mode yang disukai untuk menjalankan PHP oleh banyak komunitas. Namun, jika Anda menggunakan pengaturan konfigurasi default pengelola paket, kemungkinan besar Anda tidak akan mendapatkan hasil maksimal darinya
Dalam posting ini, saya akan memberikan gambaran singkat tentang cara meningkatkan kinerja PHP-FPM, dengan membahas tiga jenis manajer proses PHP-FPM, dan mana yang terbaik untuk digunakan dalam keadaan apa.
PHP-FPM dapat menggunakan salah satunya
- statis
- dinamis;
- sesuai permintaan
Mari kita lihat masing-masing dengan sedikit detail
Statis
Statis memastikan sejumlah proses anak selalu tersedia untuk menangani permintaan pengguna. Ini diatur dengan. Dalam mode ini, permintaan tidak perlu menunggu proses baru dimulai, yang menjadikannya pendekatan tercepat
Dengan asumsi bahwa Anda ingin menggunakan konfigurasi statis dengan 10 proses anak selalu tersedia, Anda akan mengonfigurasinya di /etc/php/7.2/fpm/pool.d/www.conf
[dengan asumsi Anda menggunakan file konfigurasi default PHP-FPM Debian/Ubunut] sebagai berikut
pm = static pm.max_children = 10
Untuk melihat apakah perubahan konfigurasi sudah efektif, setelah memulai ulang PHP-FPM, jalankan pstree -c -H-S
. Ini akan menunjukkan bahwa ada sepuluh proses yang tersedia, seperti pada contoh di bawah ini
php-fpm7.2-+-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 `-php-fpm7.2
_Dinamis
Dalam mode ini, PHP-FPM secara dinamis mengatur jumlah proses anak yang tersedia dan memastikan setidaknya satu proses anak selalu tersedia
Konfigurasi ini menggunakan lima pilihan konfigurasi;
_0. Jumlah maksimum proses anak yang diizinkan untuk dihasilkanphp-fpm7.2-+-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 `-php-fpm7.2
_1. Jumlah proses anak untuk memulai saat PHP-FPM dimulaiphp-fpm7.2-+-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 `-php-fpm7.2
_2. Jumlah minimum proses anak menganggur yang akan dibuat oleh PHP-FPM. Lebih banyak dibuat jika tersedia lebih sedikit dari jumlah iniphp-fpm7.2-+-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 `-php-fpm7.2
_3. Jumlah maksimum proses anak menganggur yang akan dibuat oleh PHP-FPM. Jika ada lebih banyak proses anak yang tersedia dari nilai ini, maka beberapa akan dimatikanphp-fpm7.2-+-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 `-php-fpm7.2
_4. Waktu idle, dalam detik, setelah itu proses anak akan dimatikanphp-fpm7.2-+-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 `-php-fpm7.2
Sekarang bagian yang menyenangkan datang;
SettingValuemax_children[Total RAM – Memori yang digunakan untuk Linux, DB, dll. ] / ukuran prosesstart_serversJumlah inti CPU x 4min_spare_serversJumlah inti CPU x 2max_spare_serversSama sepertiphp-fpm7.2-+-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 `-php-fpm7.2
5Kita juga perlu mengatur
php-fpm7.2-+-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 `-php-fpm7.2
_4, yang merupakan jumlah detik setelah proses menganggur akan dimatikanKatakanlah server kita memiliki dua CPU, masing-masing dengan empat inti, dan RAM 8 GB. Jika kita berasumsi bahwa Linux dan daemon terkait menggunakan sekitar 2GB [gunakan
php-fpm7.2-+-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 `-php-fpm7.2
7 untuk mendapatkan nilai yang lebih spesifik], itu menyisakan sekitar 6192MBSekarang, berapa banyak memori yang digunakan setiap proses? . py. Setelah menjalankannya, menggunakan
php-fpm7.2-+-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 `-php-fpm7.2
_8, Anda akan mendapatkan keluaran yang mirip dengan berikut ini28.4 MiB + 33.8 MiB = 62.2 MiB php-fpm7.2 [11]
Kolom pertama adalah memori pribadi. Kolom kedua adalah memori bersama. Kolom ketiga adalah total RAM yang digunakan. Kolom keempat adalah nama proses
Dari gambar di atas, Anda dapat melihat bahwa ukuran prosesnya adalah 62. 2MiB. Jadi, memasukkan semua informasi itu ke dalam formula kami, kami sampai pada yang berikut
# Round the result up. [8192 - 2000] / 62.2
Berdasarkan itu, kami sampai pada nilai pengaturan berikut
SettingValuemax_children100start_servers32min_spare_servers16max_spare_servers32Kami akan membiarkan
php-fpm7.2-+-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 |-php-fpm7.2 `-php-fpm7.2
_4 ke default 28.4 MiB + 33.8 MiB = 62.2 MiB php-fpm7.2 [11]
0. Dengan asumsi bahwa kami senang dengan pengaturan ini, maka kami akan mengonfigurasinya sebagai berikutpm = dynamic pm.max_children = 100 pm.start_servers = 32 pm.min_spare_servers = 16 pm.max_spare_servers = 32 pm.max_requests = 200
Anda juga dapat menggunakan alat pemantau memori secara teratur untuk memantau berapa banyak memori yang digunakan aplikasi Anda. Ada sejumlah opsi yang tersedia untuk PHP, termasuk php-memprof dan Tideways
sesuai permintaan
ondemand memiliki proses garpu PHP-FPM saat permintaan diterima. Untuk mengkonfigurasi PHP-FPM untuk menggunakannya, kita perlu mengatur
28.4 MiB + 33.8 MiB = 62.2 MiB php-fpm7.2 [11]
1 ke 28.4 MiB + 33.8 MiB = 62.2 MiB php-fpm7.2 [11]
2, dan memberikan nilai untuk- max_children
- process_idle_timeout
- max_requests
28.4 MiB + 33.8 MiB = 62.2 MiB php-fpm7.2 [11]
_3 menetapkan jumlah permintaan yang harus dijalankan oleh setiap proses anak sebelum respawning. Dokumentasi menunjukkan bahwa pengaturan ini berguna untuk mengatasi kebocoran memoriDengan asumsi bahwa kami mengambil pengaturan yang sama seperti untuk
28.4 MiB + 33.8 MiB = 62.2 MiB php-fpm7.2 [11]
2, kami akan mengonfigurasinya sebagai berikutpm = ondemand pm.max_children = 100 pm.process_idle_timeout = 10s pm.max_requests = 200
Konfigurasi Mana Yang Tepat Untuk Anda?
Sejujurnya? . “tergantung”, karena selalu bergantung pada jenis aplikasi yang Anda jalankan. Namun, berikut adalah beberapa saran tentang konfigurasi mana yang harus dipilih
Situs Lalu Lintas Rendah
Jika Anda memiliki situs dengan lalu lintas rendah, seperti hosting panel kontrol backend, seperti cPanel, gunakan ondemand. Memori akan disimpan karena proses anak hanya akan muncul saat dibutuhkan dan dimatikan saat tidak diperlukan lagi. Karena ini adalah backend, pengguna dapat menunggu satu atau dua saat lebih lama sementara utas muncul untuk menangani permintaan mereka
Situs Lalu Lintas Tinggi
Jika Anda memiliki situs web dengan lalu lintas tinggi, gunakan statis dan sesuaikan pengaturan berdasarkan kebutuhan Anda dari waktu ke waktu dan sumber daya perangkat keras yang tersedia. Mungkin tampak berlebihan untuk memiliki sejumlah besar proses anak yang selalu siap menerima permintaan
Namun, situs dengan lalu lintas tinggi perlu merespons secepat mungkin. Oleh karena itu, sangat penting untuk menggunakan statis sehingga cukup banyak proses anak yang siap melakukannya
Dengan menggunakan ondemand, proses anak kemungkinan akan menghabiskan terlalu banyak memori yang dihasilkan dan dimatikan, dan penundaan startup akan berdampak pada kinerja
Menggunakan dinamis sepertinya tidak akan seburuk itu, tergantung pada konfigurasinya. Namun, Anda mungkin berakhir dengan konfigurasi yang mencerminkan statis secara efektif
Menggunakan Beberapa Pool untuk Frontend/Backend
Sekarang untuk satu rekomendasi terakhir. melayani frontend dan backend situs web Anda menggunakan kumpulan yang berbeda. Katakanlah Anda memiliki situs e-niaga, mungkin diberdayakan oleh Magento. Anda dapat melihat aplikasi ini terdiri dari dua bagian
- Tampilan depan tempat pelanggan dapat menelusuri dan melakukan pembelian
- Backend, tempat staf admin mengelola toko [seperti menambah/menghapus produk, kategori, dan tag, dan meninjau peringkat]
Jika dilihat dengan cara ini, masuk akal untuk memiliki satu kumpulan yang melayani frontend dan kumpulan lainnya yang melayani backend dan mengonfigurasi masing-masing dengan tepat
Untuk apa nilainya, Anda dapat membagi aplikasi apa pun menjadi beberapa bagian menggunakan strategi ini, jika masuk akal untuk melakukannya. Inilah cara melakukannya
Di /etc/php/7.2/fpm/pool.d/www.conf
_, tambahkan konfigurasi berikut
; frontend [frontend] listen = /var/run/php-fpm-frontend.sock user = www-data group = www-data listen.owner = www-data listen.group = www-data pm = static pm.max_children = 5
; backend [backend] listen = /var/run/php-fpm-backend.sock user = www-data group = www-data listen.owner = www-data listen.group = www-data pm = ondemand pm.max_children = 5 pm.process_idle_timeout = 10s
Ini menciptakan dua kumpulan, satu untuk frontend, dan satu untuk backend. Keduanya memiliki pengguna dan grup yang sama, tetapi memiliki konfigurasi manajer proses yang berbeda dan terhubung melalui soket yang berbeda
Kumpulan frontend menggunakan konfigurasi statis dengan sejumlah kecil proses anak maksimum. Kumpulan backend menggunakan konfigurasi ondemand, juga dengan sejumlah kecil konfigurasi. Angka-angka ini sewenang-wenang, karena untuk keperluan contoh
Dengan itu disimpan, untuk file vhost NGINX Anda, gunakan konfigurasi berikut
server { listen 80; server_name test-site.localdomain; root /var/www/test-site/public;
access_log /var/log/nginx/test-site.access.log; error_log /var/log/nginx/test-site.error.log error; index index.php;
set $fpm_socket "unix:/var/run/php-fpm-frontend.sock";
if [$uri ~* "^/api/"] { set $fpm_socket "unix:/var/run/php-fpm-backend.sock"; }
location / { try_files $uri $uri/ /index.php;
location ~ .php$ { fastcgi_split_path_info ^[.+.php][/.+]$; fastcgi_pass $fpm_socket; fastcgi_index index.php; include fastcgi.conf; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } }
Ini membuat konfigurasi host virtual yang mengirimkan permintaan ke kumpulan frontend atau backend, berdasarkan lokasi yang diminta. Permintaan apa pun ke
28.4 MiB + 33.8 MiB = 62.2 MiB php-fpm7.2 [11]
6 dikirim ke kumpulan backend, dan semua permintaan lainnya dialihkan ke frontendKesimpulannya
Itu adalah pengantar cepat untuk menyetel PHP-FPM untuk kinerja yang lebih baik. Kami telah melihat tiga konfigurasi manajer proses yang berbeda, pengaturan terkaitnya, dan membahas kapan setiap konfigurasi masuk akal. Kami kemudian menyelesaikannya dengan melihat kumpulan pekerja