PHP-FPM: Apa Itu, Cara Kerja, dan Cara Konfigurasinya di Ubuntu

Apa Itu PHP-FPM?

PHP-FPM (PHP FastCGI Process Manager) adalah implementasi PHP FastCGI yang dirancang untuk menjalankan dan mengelola proses PHP secara efisien.

PHP-FPM banyak digunakan pada server Linux, terutama ketika PHP dijalankan bersama Nginx.

Nginx bertugas menerima request dari browser, sedangkan PHP-FPM bertugas menjalankan kode PHP. Setelah PHP-FPM selesai memproses request, hasilnya dikembalikan kepada Nginx untuk diteruskan ke browser.

Secara sederhana, alurnya adalah:

Browser → Nginx → PHP-FPM → PHP → Nginx → Browser

PHP-FPM sangat umum digunakan untuk aplikasi berbasis PHP seperti Laravel, WordPress, Symfony, dan berbagai aplikasi web lainnya.

Mengapa PHP-FPM Dibutuhkan?

Nginx dirancang sebagai web server dan reverse proxy, tetapi tidak menjalankan kode PHP secara langsung.

Ketika browser meminta halaman PHP, Nginx perlu meneruskan request tersebut ke komponen yang dapat mengeksekusi PHP.

Di sinilah PHP-FPM berperan.

PHP-FPM menyediakan sekumpulan proses PHP yang siap menerima dan memproses request. Setelah selesai, hasil pemrosesan dikirim kembali ke web server.

Dengan pendekatan tersebut, Nginx dan PHP dapat bekerja sebagai dua komponen yang memiliki tugas berbeda.

Bagaimana Cara Kerja PHP-FPM?

Untuk memahami PHP-FPM, bayangkan sebuah website Laravel yang diakses melalui browser.

Ketika pengguna membuka:

https://example.com

alur sederhananya adalah:

  1. Browser mengirim HTTP request ke server.
  2. Nginx menerima request.
  3. Nginx menentukan apakah request membutuhkan PHP.
  4. Jika membutuhkan PHP, Nginx meneruskannya ke PHP-FPM.
  5. PHP-FPM memilih worker process untuk memproses request.
  6. PHP menjalankan kode aplikasi.
  7. Aplikasi dapat berkomunikasi dengan database atau layanan lainnya.
  8. Hasil pemrosesan dikembalikan ke Nginx.
  9. Nginx mengirim response kepada browser.

Dengan demikian, PHP-FPM tidak menggantikan Nginx. Keduanya bekerja bersama.

Apa Itu PHP-FPM Pool?

PHP-FPM menggunakan konsep pool untuk mengelola worker process.

Pool memungkinkan administrator mengatur bagaimana proses PHP dijalankan, termasuk:

  • User dan group.
  • Jumlah worker process.
  • Batas request.
  • Cara komunikasi dengan web server.
  • Pengaturan resource.
  • Lokasi log tertentu.

Konfigurasi pool biasanya berada di directory:

/etc/php/<versi>/fpm/pool.d/

Contohnya:

/etc/php/8.3/fpm/pool.d/www.conf

Nama dan versi directory dapat berbeda tergantung versi PHP yang digunakan.

PHP-FPM Menggunakan Socket atau TCP

Nginx dan PHP-FPM dapat berkomunikasi menggunakan Unix socket atau TCP socket.

Unix Socket

Pada banyak konfigurasi Linux, Unix socket digunakan untuk komunikasi antara Nginx dan PHP-FPM.

Contohnya:

/run/php/php8.3-fpm.sock

Konfigurasi Nginx:

fastcgi_pass unix:/run/php/php8.3-fpm.sock;

Unix socket biasanya menjadi pilihan praktis ketika Nginx dan PHP-FPM berjalan pada server yang sama.

TCP Socket

PHP-FPM juga dapat dikonfigurasi menggunakan alamat dan port TCP.

Contohnya:

fastcgi_pass 127.0.0.1:9000;

Dalam konfigurasi ini, PHP-FPM mendengarkan koneksi pada port tertentu.

Untuk server sederhana yang menjalankan Nginx dan PHP pada mesin yang sama, Unix socket sering menjadi konfigurasi yang umum digunakan.

Cara Install PHP-FPM di Ubuntu

Sebelum menginstall PHP-FPM, perbarui package list:

sudo apt update

Kemudian install PHP-FPM:

sudo apt install php-fpm -y

Jika aplikasi membutuhkan extension tertentu, Anda dapat memasangnya sekaligus.

Contohnya:

sudo apt install php-fpm php-cli php-mysql php-curl php-mbstring php-xml php-zip php-bcmath -y

Setelah selesai, periksa versi PHP:

php -v

Cara Mengetahui Versi PHP-FPM

Versi PHP yang aktif dapat diperiksa dengan:

php -v

Anda juga dapat melihat service PHP-FPM:

systemctl list-units --type=service | grep fpm

Contoh hasil:

php8.3-fpm.service

Setiap versi PHP dapat memiliki service yang berbeda.

Karena itu, jangan langsung menyalin php8.3-fpm jika server Anda menggunakan versi PHP lainnya.

Cara Menjalankan PHP-FPM

Setelah instalasi, periksa status service:

sudo systemctl status php8.3-fpm

Jika service belum berjalan, gunakan:

sudo systemctl start php8.3-fpm

Agar PHP-FPM otomatis berjalan ketika server dinyalakan:

sudo systemctl enable php8.3-fpm

Untuk menerapkan perubahan konfigurasi tanpa melakukan reboot:

sudo systemctl restart php8.3-fpm

Ganti 8.3 sesuai versi PHP yang terpasang.

Cara Mengetahui Lokasi PHP-FPM Socket

Salah satu cara termudah:

ls -lah /run/php/

Contohnya:

php8.3-fpm.sock

Socket tersebut kemudian digunakan dalam konfigurasi Nginx:

fastcgi_pass unix:/run/php/php8.3-fpm.sock;

Jika Nginx menggunakan socket yang tidak tersedia, request PHP dapat menghasilkan 502 Bad Gateway.

Konfigurasi PHP-FPM untuk Nginx

Contoh server block Nginx sederhana:

server {
    listen 80;
    server_name example.com;

    root /var/www/myapp/public;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }
}

Bagian berikut menghubungkan Nginx dengan PHP-FPM:

fastcgi_pass unix:/run/php/php8.3-fpm.sock;

Pastikan nama socket sesuai dengan server.

Konfigurasi Pool PHP-FPM

File pool default biasanya berada di:

/etc/php/8.3/fpm/pool.d/www.conf

Buka menggunakan editor:

sudo nano /etc/php/8.3/fpm/pool.d/www.conf

Di dalam file tersebut terdapat berbagai parameter untuk mengatur worker PHP-FPM.

Salah satu bagian penting adalah:

[www]
user = www-data
group = www-data
listen = /run/php/php8.3-fpm.sock

Konfigurasi tersebut menunjukkan pool bernama www, user dan group yang digunakan, serta socket yang digunakan untuk menerima koneksi.

Mengenal pm.max_children

Salah satu parameter PHP-FPM yang penting adalah:

pm.max_children = 5

Parameter ini menentukan jumlah maksimum child process yang dapat berjalan secara bersamaan dalam sebuah pool.

Jika terlalu kecil, request dapat mengantre ketika traffic meningkat.

Jika terlalu besar, server dapat kehabisan RAM dan resource lainnya.

Karena itu, pm.max_children sebaiknya tidak ditentukan secara sembarangan. Nilainya perlu disesuaikan dengan kapasitas server dan penggunaan memory aplikasi.

Mengenal pm.start_servers

Parameter:

pm.start_servers = 2

menentukan jumlah worker yang dibuat ketika PHP-FPM menggunakan mode dynamic.

Parameter ini berkaitan dengan bagaimana PHP-FPM mempersiapkan worker saat service berjalan.

Mengenal pm.min_spare_servers

Parameter:

pm.min_spare_servers = 1

menentukan jumlah minimum worker idle yang dipertahankan dalam mode dynamic.

Worker idle tersedia untuk menangani request baru tanpa harus selalu membuat process baru.

Mengenal pm.max_spare_servers

Parameter:

pm.max_spare_servers = 3

menentukan jumlah maksimum worker idle yang dipertahankan.

Jika jumlah worker idle melebihi nilai tersebut, PHP-FPM dapat mengurangi jumlah worker.

Mengenal pm.max_requests

Parameter:

pm.max_requests = 500

menentukan berapa banyak request yang dapat diproses oleh sebuah child process sebelum process tersebut dibuat ulang.

Parameter ini dapat berguna untuk membantu mengurangi dampak memory leak pada aplikasi atau extension tertentu.

Nilai yang tepat bergantung pada karakteristik aplikasi dan server.

Mode Process Management PHP-FPM

PHP-FPM memiliki beberapa mode process management.

Dynamic

Mode dynamic mengatur jumlah worker berdasarkan beberapa parameter seperti:

pm.max_children
pm.start_servers
pm.min_spare_servers
pm.max_spare_servers

Mode ini sering digunakan pada server aplikasi web karena jumlah worker dapat disesuaikan berdasarkan kebutuhan.

Ondemand

Mode ondemand membuat worker ketika ada request yang masuk.

Contohnya:

pm = ondemand

Mode ini dapat menarik untuk server dengan traffic rendah atau aplikasi yang tidak selalu menerima request.

Static

Mode static menggunakan jumlah worker yang ditentukan:

pm = static
pm.max_children = 10

Jumlah worker lebih mudah diprediksi, tetapi konfigurasi yang terlalu tinggi dapat menggunakan resource server secara berlebihan.

Cara Mengoptimalkan PHP-FPM

Optimasi PHP-FPM sebaiknya dimulai dengan pengukuran, bukan sekadar mengubah semua nilai menjadi besar.

Beberapa hal yang perlu diperhatikan:

Periksa RAM Server

Jumlah worker PHP-FPM berpengaruh langsung terhadap penggunaan memory.

Jika setiap worker menggunakan rata-rata memory tertentu, server harus memiliki RAM yang cukup untuk menjalankan worker sekaligus service lain seperti Nginx, database, dan sistem operasi.

Perhatikan Traffic

Server dengan traffic rendah tidak membutuhkan jumlah worker sebesar server dengan traffic tinggi.

Pantau Penggunaan CPU

Jumlah worker yang terlalu banyak dapat menyebabkan persaingan resource CPU.

Gunakan Monitoring

Pantau:

  • RAM.
  • CPU.
  • Load average.
  • Jumlah request.
  • Response time.
  • PHP-FPM process.
  • Error log.

Dari data tersebut, konfigurasi dapat disesuaikan berdasarkan kondisi nyata.

Cara Mengubah php.ini

Selain pool, PHP-FPM juga memiliki konfigurasi PHP yang berasal dari php.ini.

Lokasinya biasanya seperti:

/etc/php/8.3/fpm/php.ini

Buka:

sudo nano /etc/php/8.3/fpm/php.ini

Beberapa parameter yang umum diperhatikan adalah:

memory_limit = 256M
upload_max_filesize = 32M
post_max_size = 32M
max_execution_time = 60

Nilai tersebut hanya contoh. Pengaturan yang tepat harus disesuaikan dengan kebutuhan aplikasi.

Setelah mengubah php.ini, restart PHP-FPM:

sudo systemctl restart php8.3-fpm

PHP-FPM untuk Laravel

PHP-FPM sangat umum digunakan untuk menjalankan Laravel bersama Nginx.

Struktur request-nya:

Client → Nginx → PHP-FPM → Laravel

Misalnya project Laravel berada di:

/var/www/myapp

Nginx harus diarahkan ke:

/var/www/myapp/public

Kemudian request PHP diteruskan ke PHP-FPM.

Contoh konfigurasi:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}

Konfigurasi ini memungkinkan Nginx meneruskan request ke index.php Laravel melalui PHP-FPM.

Permission PHP-FPM dan Laravel

Permission menjadi salah satu penyebab masalah yang cukup sering terjadi pada deployment Laravel.

PHP-FPM biasanya berjalan menggunakan user tertentu, misalnya:

www-data

Laravel membutuhkan akses tulis pada beberapa directory, terutama:

storage/
bootstrap/cache/

Pastikan user yang menjalankan PHP-FPM memiliki permission yang sesuai.

Hindari memberikan:

chmod -R 777

karena permission tersebut terlalu terbuka dan dapat meningkatkan risiko keamanan.

Cara Melihat Log PHP-FPM

Ketika terjadi error, log sangat penting untuk mengetahui penyebabnya.

Anda dapat melihat journal service:

sudo journalctl -u php8.3-fpm

Untuk melihat log secara real-time:

sudo journalctl -u php8.3-fpm -f

Lokasi log juga dapat berbeda berdasarkan konfigurasi PHP-FPM dan distribusi Linux.

Troubleshooting PHP-FPM

502 Bad Gateway

Jika Nginx menghasilkan:

502 Bad Gateway

periksa PHP-FPM:

sudo systemctl status php8.3-fpm

Kemudian periksa socket:

ls -lah /run/php/

Pastikan konfigurasi Nginx menggunakan socket yang sama:

fastcgi_pass unix:/run/php/php8.3-fpm.sock;

PHP-FPM Tidak Bisa Start

Periksa konfigurasi:

sudo php-fpm8.3 -t

Jika command tersebut tidak tersedia, gunakan konfigurasi yang sesuai dengan versi PHP pada server.

Periksa juga log:

sudo journalctl -u php8.3-fpm --no-pager

Kesalahan syntax pada pool configuration dapat menyebabkan PHP-FPM gagal berjalan.

Socket Tidak Ditemukan

Jika muncul error seperti:

connect() to unix:/run/php/php8.3-fpm.sock failed

periksa apakah PHP-FPM aktif dan socket tersedia:

ls -lah /run/php/

Jika tidak ada socket, periksa konfigurasi listen pada pool PHP-FPM.

Permission Denied

Jika Nginx tidak dapat mengakses socket, periksa:

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

Konfigurasi tersebut harus disesuaikan dengan user dan group yang digunakan oleh Nginx serta PHP-FPM.

Cara Restart PHP-FPM dengan Aman

Setelah mengubah konfigurasi PHP-FPM, sebaiknya validasi terlebih dahulu jika tool validasi tersedia.

Kemudian restart:

sudo systemctl restart php8.3-fpm

Periksa status:

sudo systemctl status php8.3-fpm

Jika menggunakan Nginx, Anda juga dapat memastikan konfigurasi Nginx tetap valid:

sudo nginx -t

Kemudian reload Nginx:

sudo systemctl reload nginx

PHP-FPM vs Apache mod_php

PHP dapat dijalankan melalui beberapa pendekatan.

Pada konfigurasi Apache tertentu, PHP dapat diintegrasikan menggunakan modul PHP.

Sementara itu, Nginx umumnya menggunakan PHP-FPM untuk menjalankan aplikasi PHP.

Perbedaan sederhananya:

AspekPHP-FPM + NginxApache + PHP
Web serverNginxApache
Pemrosesan PHPPHP-FPMDapat menggunakan modul atau FPM
ArsitekturTerpisahDapat terintegrasi
FleksibilitasTinggiTinggi
LaravelSangat umumJuga didukung

Tidak berarti PHP-FPM hanya dapat digunakan dengan Nginx. PHP-FPM juga dapat digunakan bersama Apache melalui konfigurasi yang sesuai.

Apakah PHP-FPM Harus Dioptimasi?

Tidak semua server membutuhkan optimasi khusus.

Untuk website kecil dengan traffic rendah, konfigurasi default PHP-FPM sering kali sudah cukup untuk memulai.

Optimasi menjadi lebih penting ketika:

  • Traffic meningkat.
  • Request PHP banyak.
  • Server memiliki RAM terbatas.
  • Terjadi antrean request.
  • Response time meningkat.
  • PHP-FPM menggunakan terlalu banyak memory.
  • Aplikasi menjalankan proses PHP yang berat.

Jangan mengubah pm.max_children atau parameter lain hanya karena menemukan nilai tertentu di internet. Konfigurasi optimal bergantung pada aplikasi dan kapasitas server.

Checklist Konfigurasi PHP-FPM di Ubuntu

Sebelum menjalankan aplikasi PHP atau Laravel di production, pastikan:

  • PHP sudah terinstall.
  • PHP-FPM sudah terinstall.
  • Service PHP-FPM aktif.
  • Versi PHP sesuai dengan kebutuhan aplikasi.
  • Socket PHP-FPM tersedia.
  • Nginx mengarah ke socket yang benar.
  • Pool PHP-FPM dikonfigurasi sesuai kapasitas server.
  • Permission aplikasi sudah benar.
  • php.ini sesuai kebutuhan aplikasi.
  • Log PHP-FPM dapat dipantau.
  • Konfigurasi Nginx berhasil melewati nginx -t.
  • HTTPS sudah digunakan untuk aplikasi production.

Kesimpulan

PHP-FPM adalah komponen penting untuk menjalankan aplikasi PHP secara efisien, terutama ketika PHP digunakan bersama Nginx.

PHP-FPM bertugas mengelola proses PHP, sedangkan Nginx menerima request dari client dan meneruskannya ke PHP-FPM ketika request membutuhkan pemrosesan PHP.

Hal utama yang perlu dipahami ketika mengonfigurasi PHP-FPM di Ubuntu adalah service, pool, worker process, socket, permission, dan integrasi dengan Nginx.

Untuk aplikasi seperti Laravel, konfigurasi dasar biasanya cukup dengan memastikan Nginx menggunakan document root public dan meneruskan request PHP ke socket PHP-FPM yang benar.

Setelah aplikasi berjalan, optimasi PHP-FPM sebaiknya dilakukan berdasarkan monitoring penggunaan CPU, RAM, jumlah worker, dan karakteristik traffic. Dengan pendekatan tersebut, server dapat dikonfigurasi secara lebih stabil tanpa melakukan tuning secara berlebihan.

FAQ PHP-FPM

Apa itu PHP-FPM?

PHP-FPM adalah PHP FastCGI Process Manager yang digunakan untuk menjalankan dan mengelola proses PHP. PHP-FPM banyak digunakan bersama Nginx untuk menjalankan aplikasi PHP seperti Laravel dan WordPress.

Apa fungsi PHP-FPM?

PHP-FPM bertugas menerima request PHP dari web server, menjalankan kode PHP, dan mengembalikan hasilnya kepada web server.

Apakah Nginx membutuhkan PHP-FPM?

Jika Nginx digunakan untuk menjalankan aplikasi PHP, diperlukan mekanisme pemrosesan PHP seperti PHP-FPM. Nginx sendiri tidak mengeksekusi kode PHP.

Apa perbedaan PHP dan PHP-FPM?

PHP adalah bahasa pemrograman sekaligus runtime yang menjalankan kode PHP, sedangkan PHP-FPM adalah process manager yang menyediakan mekanisme untuk menjalankan PHP melalui FastCGI dan mengelola worker process.

Apa hubungan PHP-FPM dengan Laravel?

Laravel adalah aplikasi berbasis PHP. Ketika Laravel dijalankan menggunakan Nginx, request PHP biasanya diteruskan oleh Nginx kepada PHP-FPM untuk dieksekusi.

Apa penyebab PHP-FPM 502 Bad Gateway?

Penyebab yang umum adalah PHP-FPM tidak berjalan, socket PHP-FPM salah, socket tidak tersedia, atau Nginx tidak memiliki permission untuk mengakses socket tersebut.

Di mana konfigurasi PHP-FPM di Ubuntu?

Konfigurasi PHP-FPM umumnya berada di /etc/php/<versi>/fpm/, sedangkan konfigurasi pool biasanya berada di /etc/php/<versi>/fpm/pool.d/.

Bagaimana cara restart PHP-FPM?

Gunakan systemctl dengan nama service sesuai versi PHP. Contohnya:

sudo systemctl restart php8.3-fpm

Berapa nilai pm.max_children yang ideal?

Tidak ada satu nilai yang cocok untuk semua server. Nilainya harus disesuaikan dengan RAM, CPU, konsumsi memory worker PHP, jenis aplikasi, dan traffic.

Apakah PHP-FPM hanya bisa digunakan dengan Nginx?

Tidak. PHP-FPM juga dapat digunakan bersama Apache dan web server atau arsitektur lain yang mendukung FastCGI.

Apakah PHP-FPM wajib dioptimasi untuk Laravel?

Tidak. Konfigurasi default dapat cukup untuk banyak aplikasi kecil. Optimasi sebaiknya dilakukan ketika monitoring menunjukkan adanya bottleneck atau kebutuhan performa tertentu.