Apa itu PHP-FPM | Instalasi dan konfigurasi PHP-FPM
PHP-FPM adalah manajer proses FastCGI tempat proses worker yang sudah dijalankan lebih dulu menerima permintaan PHP yang diteruskan web server lalu memprosesnya. Di server AlmaLinux 9 yang menjalankan Apache, panduan ini memeriksa apakah PHP-FPM sudah terpasang dan bagaimana pengaturan pool serta socket tiap situs, lalu berlanjut sampai pengujian konfigurasi dan pemeriksaan status dengan keluaran sebenarnya.
Apache juga bisa menjalankan PHP langsung dengan mod_php, tetapi jika diserahkan ke PHP-FPM, web server dan PHP menjadi terpisah. Nginx tidak bisa menjalankan PHP secara langsung, jadi permintaan diteruskan ke proses FastCGI seperti PHP-FPM. Karena itu satu PHP-FPM bisa dihubungkan ke Apache maupun Nginx. Pengaturan pool dan struktur socket di bawah ini berlaku apa adanya saat Anda menghubungkan PHP-FPM dengan Nginx.
1️⃣ Apa itu PHP-FPM: perbedaan CGI dan FastCGI
CGI (Common Gateway Interface) adalah cara standar web server menjalankan program eksternal untuk membuat konten dinamis, dan program dijalankan ulang setiap kali permintaan masuk. Biaya membuat dan menghapus proses untuk setiap permintaan menumpuk, sehingga semakin banyak akses, respons server semakin lambat.
FastCGI menghilangkan biaya itu dengan menjalankan program lebih dulu dan memproses permintaan secara berurutan. Ini seperti perbedaan antara menyalakan dan mematikan komputer setiap kali dipakai dengan langsung memakai komputer yang sudah menyala. PHP-FPM (FastCGI Process Manager) adalah manajer yang menjalankan PHP lewat FastCGI, dan sudah termasuk dalam PHP sejak versi 5.3.3.
Untuk setiap pool, yaitu sekumpulan worker, PHP-FPM menjalankan lebih dulu sejumlah worker yang ditentukan; worker yang menganggur menerima permintaan yang diteruskan web server lewat socket, memprosesnya, lalu menunggu permintaan berikutnya. File statis seperti gambar dan CSS dijawab langsung oleh web server, dan hanya file PHP yang diteruskan ke PHP-FPM. Yang berbeda hanya cara web server meneruskan permintaan ke socket: Apache memakai modul mod_proxy_fcgi dan Nginx memakai pengaturan fastcgi_pass.
2️⃣ Instalasi PHP-FPM: memeriksa paket dan memasang dengan dnf
Jika Anda memasang PHP dengan dnf di server keluarga RHEL, paket php-fpm ikut terpasang. Periksa dulu dengan rpm apakah sudah terpasang. Proses instalasi PHP sama seperti pada Instalasi APM di Rocky Linux.
rpm -qa | grep php-fpmphp-fpm-8.3.36-1.module_php.8.3.el9.remi.x86_64Jika keluarannya kosong, berarti belum terpasang; pasang dengan dnf.
dnf -y install php-fpmSetelah instalasi selesai, periksa lagi dengan perintah rpm yang sama apakah nama paketnya muncul.
3️⃣ Pengaturan PHP-FPM: pool www.conf, socket, serta mode statis dan dinamis
File konfigurasinya ada dua: pengaturan keseluruhan [/etc/php-fpm.conf] dan pengaturan pool [/etc/php-fpm.d/www.conf]. Baris yang pertama dilihat di pool bawaan www.conf adalah listen dan pm, dan nilai sesaat setelah instalasi adalah sebagai berikut.
grep -E '^(listen|pm) ' /etc/php-fpm.d/www.conflisten = /run/php-fpm/www.sock
pm = dynamiclisten adalah tempat web server meneruskan permintaan, dan nilai bawaan versi 8.3 adalah socket Unix [/run/php-fpm/www.sock]. Nilai bawaan versi lama, [127.0.0.1:9000], menerima permintaan lewat port TCP. Di dalam satu server yang sama, socket lebih ringan karena tidak melewati proses koneksi port, dan dengan listen.owner dan listen.group Anda bisa membatasi akses seperti izin file.
🔲 Pengaturan mode statis dan dinamis
pm adalah cara menjalankan worker, dan diisi salah satu dari static, dynamic, atau ondemand. Mode statis selalu menjalankan sejumlah worker sesuai angka di pm.max_children, dan pengaturan di bawah ini mempertahankan 100 worker.
pm = static
pm.max_children = 100Mode dinamis adalah bawaan dan menambah atau mengurangi jumlah worker sesuai volume permintaan. Pengaturan di bawah ini menjalankan 12 worker saat mulai, menjaga worker yang menganggur antara 6 dan 18, dan menambah hingga maksimal 120.
pm = dynamic
pm.max_children = 120
pm.start_servers = 12
pm.min_spare_servers = 6
pm.max_spare_servers = 18Mode ondemand menjalankan worker hanya saat ada permintaan dan menghentikannya setelah pm.process_idle_timeout lewat, jadi cocok untuk situs dengan akses jarang dan tidak cocok untuk situs dengan akses sering.
Ketiga mode berbeda dalam waktu menjalankan worker dan cara jumlahnya bertambah atau berkurang.
| Mode | Cara worker dijalankan | Situs yang cocok |
|---|---|---|
| static (statis) | Selalu menjalankan sejumlah worker sesuai angka di pm.max_children | Situs dengan akses sering |
| dynamic (dinamis) | Bawaan · bertambah atau berkurang dalam batas pm.start_servers, pm.min_spare_servers, dan pm.max_spare_servers sesuai volume permintaan | Situs dengan akses yang naik turun |
| ondemand | Dijalankan hanya saat ada permintaan dan dihentikan setelah pm.process_idle_timeout lewat | Situs dengan akses jarang |
max_children ditentukan dengan membagi memori server dengan memori yang dipakai satu worker. Meskipun peringatan batas [max_children] menumpuk, jangan langsung menaikkannya; terlebih dahulu pilah dari log permintaan mana yang memenuhi worker.
Batas memori dan unggahan ditentukan di php.ini, yaitu pengaturan keseluruhan PHP, dan disesuaikan bersama jumlah worker dengan situs yang Anda kelola.
memory_limit = 1024M
post_max_size = 128M
upload_max_filesize = 128MKetiga nilai ini adalah batas memori yang bisa dipakai satu skrip PHP dan ukuran file yang bisa diunggah sekaligus, dan baru berlaku setelah PHP-FPM di-restart.
🔲 Pengaturan pool per akun situs
Jika situs lebih dari satu, jangan memakai satu www.conf bersama-sama; buat file pool untuk setiap akun lalu pisahkan akun eksekusi dan socket. PHP satu situs tidak bisa membaca file akun lain, dan jumlah worker ditentukan per situs.
vi /etc/php-fpm.d/siteuser.confDi dalam file ditulis nama pool, akun eksekusi, jalur socket, dan jumlah worker.
[siteuser]
user = siteuser
group = nobody
listen = /run/php-fpm/siteuser.sock
listen.owner = siteuser
listen.group = nobody
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
chdir = /home/siteuser/wwwlisten.owner dan listen.group adalah pemilik dan grup file socket, dan PHP-FPM membuat socket dengan nilai ini saat mulai berjalan. Jika web server berjalan dengan akun nobody, tulis nobody pada listen.group; jika akun apache, tulis apache, supaya web server bisa membuka socket.
listen.owner = siteuser
listen.group = nobody
listen.mode = 0660Ketiga baris ini ada di setiap file pool, dan setelah nilainya diubah perlu restart agar socket dibuat ulang dengan izin yang baru.
🔲 Pengaturan slowlog
slowlog adalah file yang mencatat posisi eksekusi permintaan yang berlangsung lebih lama dari request_slowlog_timeout, dan jika nilainya 0, tidak ada yang dicatat. Saat mencari penyebab permintaan lambat, aktifkan dengan menentukan waktu dalam detik seperti 3s.
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 0File yang tercatat menyimpan jalur skrip permintaan lambat dan fungsi yang sedang berjalan saat itu, sehingga Anda bisa melihat plugin atau kode mana yang memakan waktu.
4️⃣ Integrasi Apache: pengaturan VirtualHost dan izin socket
Apache meneruskan permintaan file PHP ke socket pool dengan modul mod_proxy_fcgi. Satu baris SetHandler dimasukkan ke FilesMatch di dalam VirtualHost, dan untuk setiap situs ditulis socket akun tersebut.
# Satu VirtualHost per akun situs · isi SetHandler dengan socket akun tersebut (selain SetHandler, bisa juga dihubungkan dengan ProxyPassMatch)
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /home/siteuser/www
<Directory /home/siteuser/www>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/siteuser.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>DocumentRoot dan Directory adalah root web akun tersebut, dan -Indexes pada Options mencegah daftar folder tampil di browser.
🔲 Pengaturan izin socket
Saat pool dimulai, socket dibuat dengan nilai listen.owner, listen.group, dan listen.mode, lalu Anda memeriksa dengan ls apakah izinnya sudah benar.
ls -l /run/php-fpm/total 4
srw-rw---- 1 siteuser_a nobody 0 Okt 22 23:34 siteuser_a.sock
-rw-r--r-- 1 root root 7 Okt 26 03:00 php-fpm.pid
srw-rw---- 1 siteuser_b nobody 0 Okt 22 23:34 siteuser_b.sock
srw-rw----+ 1 root root 0 Okt 22 23:34 www.sockJika izin tidak cocok dan web server tidak bisa membuka socket, pengunjung menerima error 503; untuk memperbaikinya langsung tanpa restart, tentukan pemilik dan izin dengan chown dan chmod.
Ini adalah sintaks sekarang yang memisahkan pengguna dan grup dengan titik dua.
chown siteuser:nobody /run/php-fpm/siteuser.sockSetelah mengubah pemilik, atur izin menjadi 660.
chmod 660 /run/php-fpm/siteuser.sockIni adalah sintaks lama yang memisahkan pengguna dan grup dengan titik, dan di chown pada AlmaLinux 9 masih bisa dijalankan apa adanya.
chown siteuser.nobody /run/php-fpm/siteuser.sockSetelah mengubah pemilik, atur izin menjadi 660.
chmod 660 /run/php-fpm/siteuser.sockHasil kedua sintaks sama; mana pun yang dipakai, pemilik socket menjadi siteuser dan grupnya menjadi nobody.
🔲 Integrasi Nginx: pengaturan fastcgi_pass
Di Nginx, location untuk file PHP di dalam blok server meneruskan permintaan ke socket pool yang sama dengan fastcgi_pass.
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/run/php-fpm/siteuser.sock;
}Jika Nginx berjalan dengan akun nginx, listen.group pada file pool harus ditulis nginx agar socket bisa dibuka.
5️⃣ Pengujian konfigurasi dan restart: php-fpm -t dan systemctl
Setelah mengubah konfigurasi, jangan langsung restart; lakukan pemeriksaan sintaks dulu dengan php-fpm -t. Jika ada salah ketik di file pool, seluruh PHP-FPM mati saat restart dan semua situs menerima 503.
php-fpm -t[26-Oct-2026 17:33:45] NOTICE: configuration file /etc/php-fpm.conf test is successfulJika pemeriksaan lolos, pesan [test is successful] muncul bersama jalur file konfigurasi, lalu perubahan diterapkan ke PHP-FPM. Perubahan yang mengharuskan socket dibuat ulang, seperti jalur socket atau listen.owner, diterapkan dengan restart. Jika di server yang sedang berjalan Anda hanya mengubah nilai seperti jumlah worker, terapkan dengan reload.
systemctl restart php-fpmJika Anda mengubah VirtualHost, restart Apache juga.
systemctl restart httpdDaftarkan dengan enable agar otomatis berjalan saat server dinyalakan kembali.
systemctl enable php-fpmPeriksa apakah sudah terdaftar dengan is-enabled.
systemctl is-enabled php-fpmenabledPeriksa dengan status apakah worker berjalan di setiap pool.
systemctl status php-fpm● php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; enabled; preset: disabled)
Active: active (running) since x
Process: 3934033 ExecReload=/bin/kill -USR2 $MAINPID (code=exited, status=0/SUCCESS)
Main PID: 1333314 (php-fpm)
Status: "Processes active: 4, idle: 21, Requests: x, slow: 0, Traffic: x"
Tasks: x
Memory: x
CPU: x
CGroup: /system.slice/php-fpm.service
├─ 41920 "php-fpm: pool siteuser_a"
├─ 94143 "php-fpm: pool siteuser_b"
├─1333314 "php-fpm: master process (/etc/php-fpm.conf)"
├─3934078 "php-fpm: pool www"
└─4009016 "php-fpm: pool siteuser_a"
Okt 26 03:00:01 server.example.com systemd[1]: Reloading The PHP FastCGI Process Manager...
Okt 26 03:00:01 server.example.com systemd[1]: Reloaded The PHP FastCGI Process Manager.Pada baris Status, active dan idle adalah worker yang sedang memproses permintaan dan worker yang menganggur, dan CGroup mencantumkan worker menurut nama pool. Nama host dan nama pool pada keluaran diganti dengan nilai contoh.
🔢 FAQ & Konten yang Direkomendasikan
Cache
Cache: Definisi dan Semua Bidang yang Menggunakan Caching
Menjelaskan per bidang struktur tempat permintaan yang kena cache tidak pernah sampai ke worker PHP-FPM.
Server cache
Instalasi dan pengaturan Varnish Cache di Apache dan Nginx
Proses instalasi untuk menaruh server cache di depan web server agar permintaan PHP itu sendiri berkurang.
Linux
Perintah Linux: 15 Kategori
Tabel yang mengelompokkan perintah menjadi 15 kategori, termasuk rpm, grep, dan systemctl yang dipakai dalam artikel ini.
ℹ️ Pemberitahuan Afiliasi
Konten di situs ini berisi tautan afiliasi. Jika pengunjung membeli produk atau layanan melalui tautan tersebut, situs ini menerima komisi dari penjual. Harga yang dibayar pembeli(turun saat ada diskon promo ↓), tidak naik karena hal ini. Harga, diskon, dan informasi stok yang ditampilkan berlaku pada saat penulisan dan bisa berbeda dengan kondisi sebenarnya, jadi pastikan kembali di situs penjual sebelum membeli. Pemilihan dan penilaian produk dibuat berdasarkan standar kami sendiri, dan ada tidaknya komisi tidak memengaruhi urutan maupun isi penilaian.