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:
- Browser mengirim HTTP request ke server.
- Nginx menerima request.
- Nginx menentukan apakah request membutuhkan PHP.
- Jika membutuhkan PHP, Nginx meneruskannya ke PHP-FPM.
- PHP-FPM memilih worker process untuk memproses request.
- PHP menjalankan kode aplikasi.
- Aplikasi dapat berkomunikasi dengan database atau layanan lainnya.
- Hasil pemrosesan dikembalikan ke Nginx.
- 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:
| Aspek | PHP-FPM + Nginx | Apache + PHP |
|---|---|---|
| Web server | Nginx | Apache |
| Pemrosesan PHP | PHP-FPM | Dapat menggunakan modul atau FPM |
| Arsitektur | Terpisah | Dapat terintegrasi |
| Fleksibilitas | Tinggi | Tinggi |
| Laravel | Sangat umum | Juga 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.inisesuai 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.
