Apa itu PHP-FPM | Instalasi dan konfigurasi PHP-FPM

Lingkungan uji Keluarga RHELAlmaLinux 9.8Apache 2.4 + PHP-FPM 8.3akun rootDiperiksa 2026-10-26

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.

🧩 Cara CGI dan PHP-FPM memproses permintaan
Diagram penjelasan
⚙️ Eksekusi PHP
🌐 Web server
🌐 ApacheNginx
📨 Permintaan 1 · index.php📨 Permintaan 2 · wp-login.php📨 Permintaan 3 · index.php
File statis (gambar, CSS) dijawab langsung oleh web server
Dijalankan untuk setiap permintaanFastCGI · socket→
🧱 Proses CGI
Permintaan 1Proses baru → memproses → berhenti
Permintaan 2Proses baru → memproses → berhenti
Permintaan 3Proses baru → memproses → berhenti
Setelah pemrosesan selesai, prosesnya ikut hilang · permintaan berikutnya mulai dari awal lagi
🧰 Pool PHP-FPM [siteuser]
Worker 1Permintaan 1
Worker 2Permintaan 2
Worker 3Permintaan 3
Worker 4menunggu
Worker 5menunggu
Worker yang dijalankan lebih dulu menerima permintaan, lalu menunggu permintaan berikutnya setelah selesai
Jika Apache menjalankan PHP lewat CGI, proses PHP baru dimulai untuk setiap permintaan dan dihentikan setelah pemrosesan selesai, sehingga biaya membuat proses menumpuk seiring bertambahnya permintaan.
Nginx tidak punya modul yang menjalankan program CGI secara langsung, jadi kombinasi ini tidak dipakai; PHP diteruskan ke PHP-FPM lewat FastCGI.
Apache meneruskan permintaan PHP ke socket dengan mod_proxy_fcgi, lalu worker PHP-FPM yang sudah dijalankan lebih dulu menerimanya, memprosesnya, dan menunggu permintaan berikutnya.
Nginx meneruskan permintaan ke socket yang sama dengan fastcgi_pass, jadi meskipun web server-nya berbeda, pool PHP-FPM tetap satu dan sama.

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-fpm
php-fpm-8.3.36-1.module_php.8.3.el9.remi.x86_64

Jika keluarannya kosong, berarti belum terpasang; pasang dengan dnf.

dnf -y install php-fpm

Setelah 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.conf
listen = /run/php-fpm/www.sock
pm = dynamic

listen 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 = 100

Mode 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 = 18

Mode 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.

ModeCara worker dijalankanSitus yang cocok
static (statis)Selalu menjalankan sejumlah worker sesuai angka di pm.max_childrenSitus 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 permintaanSitus dengan akses yang naik turun
ondemandDijalankan hanya saat ada permintaan dan dihentikan setelah pm.process_idle_timeout lewatSitus 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 = 128M

Ketiga 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.conf

Di 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/www

listen.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 = 0660

Ketiga 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 = 0

File 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.sock

Jika 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.sock

Setelah mengubah pemilik, atur izin menjadi 660.

chmod 660 /run/php-fpm/siteuser.sock

Ini 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.sock

Setelah mengubah pemilik, atur izin menjadi 660.

chmod 660 /run/php-fpm/siteuser.sock

Hasil 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 successful

Jika 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-fpm

Jika Anda mengubah VirtualHost, restart Apache juga.

systemctl restart httpd

Daftarkan dengan enable agar otomatis berjalan saat server dinyalakan kembali.

systemctl enable php-fpm

Periksa apakah sudah terdaftar dengan is-enabled.

systemctl is-enabled php-fpm
enabled

Periksa 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

mod_php menjalankan PHP di dalam proses Apache sehingga pengaturannya sederhana, tetapi PHP dimuat di setiap worker Apache, yang memakan banyak memori dan menyulitkan pemisahan akun eksekusi per situs. PHP-FPM memisahkan PHP ke proses tersendiri sehingga setiap situs bisa punya akun dan jumlah worker sendiri; karena itu, di server dengan banyak situs atau yang memakai Nginx, gunakan PHP-FPM.

systemctl reload php-fpm mengirim sinyal USR2 ke proses induk untuk membaca ulang pengaturan dan mengganti worker. Jika process_control_timeout ditentukan, worker yang sudah menyelesaikan permintaan yang sedang diproses diganti lebih dulu (menurut dokumentasi resmi). restart menurunkan lalu menaikkan semua worker sekaligus sehingga permintaan pada saat itu bisa terputus; di server yang sedang berjalan, gunakan reload terlebih dahulu.

Log bawaan keluarga RHEL adalah [/var/log/php-fpm/error.log], dan peringatan kekurangan worker (seems busy · max_children) serta catatan mulai dan berhentinya pool tersimpan di sana. File yang ditentukan per pool dengan php_admin_value[error_log] mencatat error kode PHP situs tersebut secara terpisah. Pool bawaan mencatat ke [/var/log/php-fpm/www-error.log].

ℹ️ 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.

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Buktikan bahwa Anda manusia: 5   +   1   =