Cara Menggunakan PHP-FPM di Nginx: Panduan Lengkap Konfigurasi untuk Web Server Optimal

Nginx dan PHP-FPM adalah dua komponen yang menjadi tulang punggung banyak aplikasi web modern. Jika Anda seorang developer atau system administrator yang mengelola server, memahami bagaimana keduanya bekerja sama adalah kunci untuk membangun dan mengelola website yang cepat, stabil, dan efisien. Nginx unggul dalam menangani koneksi statis dan bekerja sebagai reverse proxy yang ringan, sementara PHP-FPM (FastCGI Process Manager) bertanggung jawab untuk mengeksekusi kode PHP dengan performa yang superior.

Kombinasi Nginx dan PHP-FPM adalah solusi yang saya rekomendasikan untuk hampir semua project PHP di server produksi, mulai dari website WordPress skala kecil hingga aplikasi web kustom yang kompleks. Pendekatan ini terbukti lebih cepat dan lebih aman dibandingkan menggunakan modul PHP tradisional seperti mod_php di Apache. Pada artikel ini, kita akan membahas secara tuntas cara mengkonfigurasi Nginx untuk bekerja dengan PHP-FPM, mulai dari instalasi hingga optimasi dasar.

Daftar Isi sembunyikan

Memahami Nginx dan PHP-FPM

Sebelum kita terjun ke langkah-langkah teknis, mari kita pahami terlebih dahulu apa itu Nginx dan PHP-FPM, serta mengapa kombinasi ini sangat powerful.

Nginx: Web Server dan Reverse Proxy Serbaguna

Nginx (dibaca “engine-x”) adalah web server open-source yang sangat populer, dikenal karena performa tinggi, stabilitas, dan penggunaan resource yang rendah. Berbeda dengan Apache yang menggunakan model berbasis proses (atau thread) untuk setiap koneksi, Nginx menggunakan arsitektur event-driven, non-blocking, dan asynchronous. Ini membuatnya sangat efisien dalam menangani banyak koneksi bersamaan (C10k problem) dan ideal untuk melayani konten statis atau sebagai reverse proxy.

  • Performa Tinggi: Sangat cepat dalam melayani konten statis.
  • Skalabilitas: Mampu menangani ribuan koneksi konkuren dengan resource minimal.
  • Reverse Proxy: Ideal untuk mengarahkan lalu lintas ke server aplikasi lain (seperti PHP-FPM).

PHP-FPM: Manajer Proses FastCGI untuk PHP

PHP-FPM adalah implementasi FastCGI untuk PHP yang menyediakan manajemen proses yang lebih canggih, fitur logging yang lebih baik, dan kemampuan untuk mengelola pool proses PHP yang berbeda. Dalam arsitektur web server modern, PHP tidak lagi dijalankan sebagai modul langsung di dalam web server (seperti mod_php di Apache), melainkan sebagai proses terpisah yang berkomunikasi dengan web server melalui protokol FastCGI.

PHP-FPM berperan sebagai “penerjemah” atau “eksekutor” kode PHP. Ketika Nginx menerima permintaan untuk file PHP, Nginx tidak mengeksekusinya sendiri. Sebaliknya, Nginx meneruskan permintaan tersebut ke PHP-FPM. PHP-FPM kemudian mengambil permintaan itu, mengeksekusi script PHP, dan mengembalikan hasilnya (biasanya HTML) kembali ke Nginx, yang kemudian mengirimkannya ke browser klien.

  • Performa: Mengeksekusi script PHP secara efisien dan cepat.
  • Stabilitas: Isolasi proses, jika satu script PHP crash, tidak akan memengaruhi script lain.
  • Fleksibilitas: Dapat mengelola berbagai pool PHP dengan konfigurasi berbeda (misalnya, beberapa versi PHP di satu server).

Mengapa Menggunakan PHP-FPM dengan Nginx?

Kombinasi Nginx dan PHP-FPM menawarkan banyak keunggulan:

  • Pemisahan Tugas: Nginx fokus melayani request HTTP dan aset statis, sementara PHP-FPM fokus mengeksekusi kode PHP. Ini membuat kedua komponen lebih efisien.
  • Skalabilitas Superior: Arsitektur event-driven Nginx dan manajemen proses PHP-FPM memungkinkan server menangani beban kerja yang jauh lebih besar.
  • Keamanan Lebih Baik: PHP-FPM dapat menjalankan script PHP di bawah user dan group yang berbeda untuk setiap situs, meningkatkan isolasi dan keamanan.
  • Penggunaan Resource Optimal: PHP-FPM dapat dikonfigurasi untuk mengelola jumlah proses PHP secara dinamis, menghemat memori saat tidak ada traffic tinggi.

Prasyarat Instalasi

Sebelum kita memulai konfigurasi, pastikan Anda memiliki prasyarat berikut:

  • Sebuah server Linux (Panduan ini akan fokus pada Ubuntu 22.04 LTS atau lebih baru, karena ini adalah pilihan OS server yang sangat umum di kalangan developer).
  • Akses root atau user dengan hak sudo.
  • Domain atau IP Address yang mengarah ke server Anda (opsional, tapi disarankan untuk uji coba).

Jika Anda belum menginstal Nginx dan PHP-FPM, kita akan melakukannya bersama.

Langkah 1: Menginstal Nginx dan PHP-FPM

Pertama-tama, kita perlu mengupdate daftar paket dan kemudian menginstal Nginx dan PHP-FPM. Saya akan menggunakan PHP versi 8.2 sebagai contoh. Anda bisa menyesuaikannya dengan versi PHP yang Anda inginkan (misalnya php8.1-fpm, php8.3-fpm, dst.).

Update Paket Server

Selalu mulai dengan mengupdate indeks paket untuk memastikan Anda mendapatkan versi software terbaru.

sudo apt update
sudo apt upgrade -y

Menginstal Nginx

Instal Nginx dari repositori default Ubuntu:

sudo apt install nginx -y

Setelah terinstal, Nginx akan otomatis berjalan. Anda bisa memeriksanya:

sudo systemctl status nginx

Jika output menunjukkan “active (running)”, Nginx sudah siap. Anda juga bisa menguji akses Nginx dengan membuka IP Address server Anda di browser. Anda seharusnya melihat halaman “Welcome to Nginx!”

Menginstal PHP-FPM dan Ekstensi PHP yang Umum

Instal paket PHP-FPM beserta beberapa ekstensi PHP yang umum dibutuhkan. Versi PHP biasanya mengikuti versi yang tersedia di repositori Ubuntu. Jika Anda ingin versi PHP spesifik yang lebih baru, Anda mungkin perlu menambahkan PPA (Personal Package Archive) seperti Ondrej Sury.

sudo apt install php8.2-fpm php8.2-cli php8.2-mysql php8.2-mbstring php8.2-xml php8.2-zip php8.2-gd php8.2-curl -y

Setelah instalasi, PHP-FPM juga akan otomatis berjalan. Periksa statusnya:

sudo systemctl status php8.2-fpm

Pastikan statusnya “active (running)”.

Langkah 2: Konfigurasi PHP-FPM Pool

Secara default, PHP-FPM membuat sebuah “pool” bernama www. File konfigurasi untuk pool ini biasanya terletak di /etc/php/8.2/fpm/pool.d/www.conf (sesuaikan versi PHP Anda). Kita perlu memastikan beberapa pengaturan penting di sini.

Buka file konfigurasi pool:

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

Pengaturan User dan Group

Pastikan PHP-FPM berjalan dengan user dan group yang sama dengan Nginx, biasanya www-data. Cari baris berikut dan pastikan nilainya:

user = www-data
group = www-data

Ini penting agar PHP-FPM memiliki izin untuk membaca dan menulis file di direktori web yang akan diakses oleh Nginx.

Metode Mendengarkan (Listen)

PHP-FPM dapat mendengarkan permintaan melalui soket Unix domain (file) atau melalui soket TCP/IP (port). Untuk aplikasi yang berjalan di server yang sama, Unix domain socket lebih direkomendasikan karena sedikit lebih cepat dan tidak memakan port TCP. Cari baris listen:

listen = /run/php/php8.2-fpm.sock

Pastikan ini sesuai dengan versi PHP Anda. Jika Anda menemukan listen = 127.0.0.1:9000, Anda bisa mengubahnya ke Unix socket atau biarkan jika Anda memang ingin menggunakan TCP (biasanya untuk setup yang lebih kompleks dengan PHP-FPM di server terpisah).

Manajemen Proses (Process Manager – pm)

Pengaturan ini sangat krusial untuk performa dan penggunaan memori. Ada tiga opsi utama:

  • pm = static: Jumlah proses child PHP yang tetap. Menggunakan memori paling banyak, cocok untuk server dengan beban sangat tinggi dan memori besar.
  • pm = dynamic: Proses child PHP akan dibuat secara dinamis antara batas minimum dan maksimum. Ini adalah pilihan umum dan baik untuk sebagian besar kasus.
  • pm = ondemand: Proses child PHP dibuat saat ada permintaan, dan diakhiri setelah tidak ada aktivitas. Menggunakan memori paling sedikit, cocok untuk server dengan RAM terbatas atau trafik rendah, tapi mungkin ada sedikit latensi awal.

Untuk memulai, dynamic adalah pilihan yang aman. Pastikan baris-baris berikut dikonfigurasi:

pm = dynamic
pm.max_children = 50 ; Jumlah maksimal proses child
pm.start_servers = 5 ; Jumlah child saat PHP-FPM dimulai
pm.min_spare_servers = 5 ; Minimal proses idle yang harus ada
pm.max_spare_servers = 35 ; Maksimal proses idle yang boleh ada

Nilai-nilai ini perlu disesuaikan dengan spesifikasi server (RAM dan CPU) dan perkiraan beban trafik Anda. Saya akan bahas lebih lanjut di bagian optimasi.

Setelah Perubahan

Simpan perubahan (Ctrl+O, Enter, Ctrl+X). Kemudian, restart PHP-FPM agar perubahan diterapkan:

sudo systemctl restart php8.2-fpm

Langkah 3: Konfigurasi Nginx untuk PHP-FPM

Sekarang, kita perlu memberitahu Nginx bagaimana cara meneruskan permintaan file PHP ke PHP-FPM. Kita akan membuat file konfigurasi server block baru untuk website Anda.

Buat Direktori Root untuk Website

Buat direktori tempat file website Anda akan disimpan. Ganti your_domain.com dengan nama domain Anda.

sudo mkdir -p /var/www/your_domain.com/public_html

Atur izin agar Nginx dan user Anda bisa mengaksesnya:

sudo chown -R www-data:www-data /var/www/your_domain.com
sudo chmod -R 755 /var/www/your_domain.com

Buat File Konfigurasi Nginx Server Block

Buat file konfigurasi baru di direktori /etc/nginx/sites-available/. Contoh namanya bisa your_domain.com.

sudo nano /etc/nginx/sites-available/your_domain.com

Isi dengan konfigurasi berikut. Pastikan Anda mengganti your_domain.com dengan domain Anda dan versi PHP-FPM.

server {
    listen 80;
    server_name your_domain.com www.your_domain.com;
    root /var/www/your_domain.com/public_html;
    index index.php index.html index.htm;

    # Log files
    access_log /var/log/nginx/your_domain.com_access.log;
    error_log /var/log/nginx/your_domain.com_error.log;

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

    # Pass PHP scripts to PHP-FPM
    location ~ \.php$ {
        include snippets/fastcgi-php.conf; # Jika ada, atau pakai setting di bawah
        fastcgi_pass unix:/run/php/php8.2-fpm.sock; # Ganti versi PHP jika beda
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Prevent access to hidden files
    location ~ /\.ht {
        deny all;
    }

    # Cache static files
    location ~* \.(jpg|jpeg|gif|png|webp|svg|woff|woff2|ttf|css|js|ico)$ {
        expires 365d;
        add_header Cache-Control "public, no-transform";
    }
}

Beberapa poin penting dalam konfigurasi di atas:

  • listen 80;: Nginx akan mendengarkan di port HTTP standar.
  • server_name your_domain.com www.your_domain.com;: Tentukan nama domain yang akan dilayani oleh server block ini.
  • root /var/www/your_domain.com/public_html;: Direktori root tempat file website Anda berada.
  • index index.php index.html index.htm;: Urutan file indeks yang dicari Nginx.
  • location /: Mengatur bagaimana Nginx menangani permintaan URL. try_files mencoba menemukan file atau direktori, jika tidak ditemukan, akan mengarahkan ke index.php.
  • location ~ \.php$: Ini adalah blok yang paling penting. Ini memberitahu Nginx untuk meneruskan semua permintaan yang berakhir dengan .php ke PHP-FPM.
  • fastcgi_pass unix:/run/php/php8.2-fpm.sock;: Ini adalah perintah yang mengarahkan Nginx untuk mengirim permintaan ke soket Unix domain PHP-FPM kita.
  • fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;: Parameter ini memberitahu PHP-FPM lokasi file script yang diminta.
  • include fastcgi_params;: Mengimpor set parameter FastCGI standar.

Simpan dan tutup file.

Aktifkan Server Block

Buat symlink dari file konfigurasi di sites-available ke sites-enabled untuk mengaktifkannya. Juga, hapus symlink default Nginx agar tidak terjadi konflik.

sudo ln -s /etc/nginx/sites-available/your_domain.com /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default

Uji Konfigurasi Nginx dan Restart

Sebelum me-restart Nginx, selalu uji konfigurasi Anda untuk memastikan tidak ada kesalahan sintaks:

sudo nginx -t

Jika output menunjukkan “syntax is ok” dan “test is successful”, Anda bisa melanjutkan untuk me-restart Nginx:

sudo systemctl restart nginx

Langkah 4: Verifikasi Konfigurasi dengan File info.php

Untuk memastikan Nginx dan PHP-FPM bekerja sama dengan benar, kita akan membuat file PHP sederhana di direktori root website Anda.

sudo nano /var/www/your_domain.com/public_html/info.php

Isi file tersebut dengan baris kode PHP berikut:

<?php
phpinfo();
?>

Simpan dan tutup file.

Sekarang, buka browser Anda dan akses http://your_domain.com/info.php (ganti your_domain.com dengan IP Address atau domain Anda). Jika semuanya terkonfigurasi dengan benar, Anda akan melihat halaman informasi PHP lengkap, yang menunjukkan bahwa PHP-FPM telah berhasil mengeksekusi script PHP melalui Nginx.

Setelah selesai verifikasi, sangat disarankan untuk menghapus file info.php dari server produksi Anda demi keamanan, karena dapat mengekspos informasi sensitif tentang server dan konfigurasi PHP Anda.

sudo rm /var/www/your_domain.com/public_html/info.php

Optimalisasi dan Best Practice untuk Nginx dan PHP-FPM

Konfigurasi dasar sudah selesai, namun untuk performa dan keamanan yang optimal, ada beberapa hal yang perlu dipertimbangkan:

1. Tuning PHP-FPM Pool Manager (pm)

Parameter pm (process manager) di /etc/php/8.2/fpm/pool.d/www.conf adalah kunci untuk menyeimbangkan penggunaan memori dan kemampuan server untuk menangani permintaan.

  • Memahami Kebutuhan Memori: Hitung rata-rata konsumsi memori satu proses PHP-FPM (misal, dengan ps aux | grep php-fpm, lalu lihat kolom RSS/VSZ). Misalnya, jika satu proses memakan 50MB, dan Anda punya 2GB RAM yang bisa dialokasikan untuk PHP-FPM, maka pm.max_children bisa sekitar 40 (2000MB / 50MB).
  • pm = dynamic: Umumnya paling fleksibel.
    • pm.max_children: Jumlah maksimal child proses yang bisa dibuat.
    • pm.start_servers: Jumlah child proses yang dibuat saat PHP-FPM dimulai.
    • pm.min_spare_servers: Minimal child proses idle yang harus dipertahankan.
    • pm.max_spare_servers: Maksimal child proses idle yang boleh ada.

    Aturan praktis: start_servers = min_spare_servers, dan max_spare_servers tidak boleh terlalu jauh dari max_children. Hindari max_spare_servers yang terlalu rendah jika traffic sering lonjakan.

  • pm = ondemand: Hemat memori, tetapi ada sedikit overhead saat proses baru dibuat. Baik untuk server kecil atau trafik rendah.
  • pm = static: Mengalokasikan semua proses child sekaligus. Paling cepat untuk server dengan banyak RAM dan traffic sangat tinggi, tapi boros memori.

Selalu restart PHP-FPM setelah mengubah konfigurasi pool.

2. Konfigurasi PHP.ini

File php.ini (`/etc/php/8.2/fpm/php.ini`) mengandung pengaturan PHP utama. Beberapa yang penting untuk performa dan keamanan:

  • memory_limit: Batas memori untuk setiap script PHP. Sesuaikan dengan kebutuhan aplikasi Anda.
  • upload_max_filesize dan post_max_size: Batas ukuran file yang diizinkan untuk diunggah.
  • max_execution_time: Batas waktu eksekusi script.
  • expose_php = Off: Penting untuk keamanan. Menyembunyikan versi PHP di header HTTP.
  • date.timezone: Atur zona waktu yang benar, misal Asia/Jakarta.

Restart PHP-FPM setelah mengubah php.ini.

3. Security Hardening

  • Disable expose_php: Sudah dibahas, matikan ini di php.ini.
  • open_basedir: Batasi PHP untuk hanya mengakses file dalam direktori tertentu. Tambahkan ke file www.conf atau per-site di Nginx. Contoh: php_admin_value[open_basedir] = /var/www/your_domain.com:/tmp/
  • disable_functions: Nonaktifkan fungsi-fungsi PHP yang berbahaya jika tidak diperlukan, misal exec, shell_exec, system, passthru, proc_open, popen, symlink, pcntl_exec, dl.
  • Log Errors: Pastikan Nginx dan PHP-FPM mengkonfigurasi error log ke lokasi yang berbeda dan sering dipantau.
  • Firewall: Pastikan Anda memiliki firewall (misal UFW) yang hanya mengizinkan port 80 (HTTP) dan 443 (HTTPS) dari luar.

4. Penggunaan Unix Socket vs. TCP Port

Seperti yang sudah dibahas, untuk Nginx dan PHP-FPM yang berjalan di server yang sama, Unix domain socket (`unix:/run/php/php8.2-fpm.sock`) umumnya lebih cepat karena melewati overhead TCP/IP stack. Ini adalah praktik terbaik.

TCP Port (`127.0.0.1:9000`) digunakan jika PHP-FPM dan Nginx berada di server yang berbeda atau jika Anda menjalankan beberapa aplikasi PHP-FPM di port berbeda untuk alasan tertentu.

5. HTTPS (SSL/TLS)

Untuk keamanan dan SEO, sangat penting untuk mengaktifkan HTTPS. Anda bisa menggunakan Certbot untuk mendapatkan sertifikat SSL gratis dari Let’s Encrypt dan secara otomatis mengkonfigurasi Nginx. Prosesnya relatif mudah:

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d your_domain.com -d www.your_domain.com

Ikuti instruksi yang muncul, dan Certbot akan otomatis mengubah konfigurasi Nginx Anda ke HTTPS.

Pengalaman dan Pertimbangan Praktis

Setelah bertahun-tahun mengelola berbagai server, saya punya beberapa observasi dan tips praktis terkait Nginx dan PHP-FPM:

1. Jangan Terlalu Agresif dengan Optimasi Awal:
Di awal proyek, seringkali kita tergoda untuk melakukan tuning PHP-FPM seoptimal mungkin. Dalam praktiknya, ini bisa jadi bumerang. Terlalu sedikit pm.max_children bisa membuat aplikasi lambat atau bahkan crash karena kehabisan proses, sementara terlalu banyak membuang RAM yang berharga. Mulailah dengan pengaturan dinamis yang moderat (misal, pm.max_children = 20 untuk server 2GB RAM), lalu pantau penggunaan resource dengan htop atau free -h. Tingkatkan secara bertahap jika ada indikasi kekurangan resource pada PHP-FPM.

2. Memantau Error Log adalah Kunci:
Banyak masalah aplikasi web muncul di error log Nginx atau PHP-FPM. Saya sering menemukan developer hanya melihat log aplikasi mereka sendiri. Padahal, Nginx error log (misal: /var/log/nginx/your_domain.com_error.log) seringkali menunjukkan masalah di layer web server, seperti permission denied, file not found, atau 502 Bad Gateway yang akan saya bahas nanti. Log PHP-FPM (/var/log/php8.2-fpm.log atau lokasi yang dikonfigurasi) akan menunjukkan error PHP itu sendiri.

3. Prioritaskan Keamanan di PHP.ini dan Nginx:
Pengaturan seperti expose_php = Off di php.ini dan deny all untuk file .ht* di Nginx seringkali diabaikan oleh pemula. Padahal, ini adalah lapisan pertahanan pertama dari serangan umum. Selalu pastikan Anda tidak mengekspos informasi sensitif atau memberikan akses ke file konfigurasi yang tidak perlu.

4. Pertimbangkan HTTP/2 untuk Performa Lebih Lanjut:
Setelah mengkonfigurasi HTTPS, Anda bisa mengaktifkan HTTP/2 di Nginx untuk performa yang lebih baik. Cukup tambahkan http2 di bagian listen 443 ssl di konfigurasi Nginx Anda. Misalnya: listen 443 ssl http2;. Ini membantu loading website menjadi lebih cepat melalui multiplexing request.

5. Gunakan Monitoring Tools:
Untuk server produksi, tools monitoring seperti Prometheus/Grafana, Zabbix, atau bahkan tool bawaan cloud provider akan sangat membantu Anda dalam mengidentifikasi bottleneck performa, penggunaan resource yang tidak normal, dan potensi masalah sebelum menjadi krisis. Memantau jumlah proses PHP-FPM, CPU usage, dan memory usage secara real-time akan memberikan insight berharga.

Masalah yang Sering Terjadi dan Solusinya

Dalam pengalaman saya mengkonfigurasi Nginx dan PHP-FPM, beberapa masalah umum sering muncul:

1. Nginx 502 Bad Gateway

  • Gejala: Browser menampilkan error 502 Bad Gateway saat mencoba mengakses file PHP.
  • Penyebab: Nginx tidak dapat berkomunikasi dengan PHP-FPM. Ini bisa karena:
    1. PHP-FPM tidak berjalan.
    2. Jalur Unix socket atau port TCP yang dikonfigurasi di Nginx salah atau tidak cocok dengan PHP-FPM.
    3. Izin file atau direktori socket PHP-FPM salah.
    4. PHP-FPM mengalami crash atau kehabisan resource.
  • Solusi:
    1. Periksa status PHP-FPM: sudo systemctl status php8.2-fpm. Jika tidak berjalan, coba restart: sudo systemctl restart php8.2-fpm.
    2. Pastikan jalur socket di Nginx (fastcgi_pass unix:/run/php/php8.2-fpm.sock;) cocok dengan listen di /etc/php/8.2/fpm/pool.d/www.conf.
    3. Periksa izin direktori /run/php/: ls -l /run/php/. Pastikan socket memiliki izin yang memungkinkan Nginx mengaksesnya (biasanya www-data user/group).
    4. Periksa log PHP-FPM (/var/log/php8.2-fpm.log atau Nginx error log) untuk melihat penyebab crash.

2. Nginx 403 Forbidden

  • Gejala: Browser menampilkan error 403 Forbidden saat mencoba mengakses file PHP atau direktori website.
  • Penyebab: Nginx tidak memiliki izin untuk membaca file atau direktori.
  • Solusi:
    1. Pastikan direktori root website Anda (misal /var/www/your_domain.com/public_html) memiliki izin yang benar:
      sudo chown -R www-data:www-data /var/www/your_domain.com
      sudo chmod -R 755 /var/www/your_domain.com
    2. Pastikan semua file PHP memiliki izin baca yang benar.
    3. Periksa error log Nginx untuk detail lebih lanjut.

3. Kode PHP Diunduh alih-alih Dieksekusi

  • Gejala: Saat mengakses file PHP, browser mengunduh file tersebut alih-alih menampilkannya.
  • Penyebab: Nginx tidak mengidentifikasi file tersebut sebagai script PHP dan tidak meneruskannya ke PHP-FPM. Biasanya ada kesalahan pada blok location ~ \.php$.
  • Solusi:
    1. Periksa kembali konfigurasi Nginx server block Anda, khususnya blok location ~ \.php$. Pastikan tidak ada typo atau kesalahan sintaks.
    2. Pastikan Anda sudah mengaktifkan server block (symlink ke sites-enabled) dan me-restart Nginx.

4. Nginx “No input file specified.” Error

  • Gejala: Browser menampilkan halaman error dengan tulisan “No input file specified.” saat mengakses file PHP.
  • Penyebab: PHP-FPM menerima permintaan dari Nginx, tetapi tidak dapat menemukan file script yang diminta. Ini seringkali karena parameter SCRIPT_FILENAME salah di konfigurasi Nginx.
  • Solusi:
    1. Pastikan baris fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; sudah ada di blok location ~ \.php$ Nginx Anda.
    2. Periksa apakah $document_root dan $fastcgi_script_name menghasilkan jalur file yang benar. Direktori root di Nginx harus benar-benar mengarah ke folder public_html website Anda.
    3. Periksa juga bahwa file PHP yang diminta benar-benar ada di direktori root yang benar.

5. PHP-FPM Child Processes Mengonsumsi Terlalu Banyak Memori atau CPU

  • Gejala: Server melambat, memori penuh, atau penggunaan CPU tinggi, dan htop menunjukkan banyak proses PHP-FPM.
  • Penyebab:
    1. Konfigurasi pm (max_children, dll.) di PHP-FPM terlalu tinggi untuk resource server Anda.
    2. Ada script PHP yang tidak efisien atau memakan banyak memori.
    3. Serangan DDoS atau lonjakan traffic yang tidak terduga.
  • Solusi:
    1. Tuning ulang parameter pm di /etc/php/8.2/fpm/pool.d/www.conf. Kurangi pm.max_children secara bertahap dan pantau. Pertimbangkan menggunakan pm = ondemand jika RAM sangat terbatas.
    2. Optimasi kode PHP aplikasi Anda. Gunakan profiler untuk menemukan bottleneck.
    3. Tambahkan cache (misal Redis atau Memcached) untuk mengurangi beban pada PHP.
    4. Jika karena traffic, pertimbangkan scaling server atau menggunakan CDN.

FAQ

Apa bedanya PHP-FPM dengan mod_php?

mod_php adalah modul PHP yang berjalan langsung di dalam proses web server Apache. Ini sederhana untuk dikonfigurasi tetapi kurang efisien karena setiap proses Apache memuat PHP interpreter, memakan banyak memori. PHP-FPM adalah manajer proses FastCGI yang menjalankan proses PHP secara terpisah dari web server. Nginx (atau Apache dengan mod_proxy_fcgi) berkomunikasi dengan PHP-FPM melalui protokol FastCGI. Ini lebih efisien, lebih aman (isolasi proses), dan lebih skalabel.

Apakah PHP-FPM lebih cepat?

Ya, secara umum PHP-FPM lebih cepat dan efisien dibandingkan mod_php, terutama dalam skenario beban tinggi. Ini karena PHP-FPM menjaga pool proses PHP yang siap melayani permintaan, mengurangi overhead inisialisasi, dan menggunakan arsitektur event-driven yang lebih baik untuk konkurensi.

Bagaimana cara mengganti versi PHP-FPM di Nginx?

Untuk mengganti versi PHP-FPM, Anda perlu menginstal versi PHP-FPM yang diinginkan (misal php8.3-fpm). Kemudian, di file konfigurasi Nginx server block Anda, ubah baris fastcgi_pass unix:/run/php/php8.2-fpm.sock; menjadi fastcgi_pass unix:/run/php/php8.3-fpm.sock;. Pastikan juga konfigurasi pool PHP-FPM yang baru sudah benar. Setelah itu, restart Nginx dan PHP-FPM versi baru.

Bisakah saya menjalankan beberapa versi PHP dengan PHP-FPM di satu server?

Ya, ini adalah salah satu keunggulan PHP-FPM. Anda dapat menginstal beberapa versi PHP-FPM (misal php7.4-fpm dan php8.2-fpm) dan membuat pool terpisah untuk masing-masing versi. Kemudian, di file konfigurasi Nginx server block setiap website, Anda bisa menunjuk ke soket Unix domain PHP-FPM spesifik untuk versi PHP yang diinginkan oleh website tersebut. Ini sangat berguna untuk mengelola aplikasi warisan yang membutuhkan PHP versi lama sambil tetap mengembangkan proyek baru dengan PHP versi terbaru.

Bagaimana cara memantau penggunaan PHP-FPM?

Anda bisa memantau PHP-FPM menggunakan beberapa cara:

  • htop atau top: Untuk melihat proses php-fpm dan penggunaan CPU/memori secara real-time.
  • Status Page PHP-FPM: Di file www.conf, aktifkan pm.status_path = /status. Kemudian di Nginx, buat lokasi untuk /status dan izinkan IP Anda untuk mengaksesnya. Ini akan menampilkan statistik detail tentang pool PHP-FPM Anda.
  • Log files: Error log PHP-FPM (/var/log/php8.2-fpm.log) dan slow log (jika diaktifkan) memberikan insight tentang masalah dan script lambat.

Kesimpulan

Mengkonfigurasi PHP-FPM dengan Nginx adalah langkah fundamental untuk siapa pun yang serius dalam membangun dan mengelola aplikasi web berbasis PHP. Dengan mengikuti panduan ini, Anda tidak hanya akan mendapatkan server yang berfungsi, tetapi juga pondasi yang kuat untuk performa dan skalabilitas. Ingatlah bahwa konfigurasi server bukanlah tugas “atur sekali dan lupakan”. Penting untuk terus memantau, mengoptimasi, dan mengadaptasi konfigurasi seiring bertambahnya beban dan kebutuhan aplikasi Anda.

Pendekatan modular Nginx dan PHP-FPM menawarkan fleksibilitas yang luar biasa, memungkinkan Anda untuk menyesuaikan setiap aspek server sesuai kebutuhan spesifik project Anda. Dengan pemahaman yang tepat tentang cara kerja kedua komponen ini, Anda bisa memastikan website Anda berjalan dengan cepat, aman, dan efisien.

TAGS: Nginx, PHP-FPM, Konfigurasi Server, Web Server, PHP, Ubuntu, VPS, DevOps, FastCGI, Server Optimization


Baca Juga

You May Also Like

Tinggalkan Balasan

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