Bagi developer modern, Nginx adalah pilihan web server favorit karena performanya yang ringan dan kemampuannya menangani banyak koneksi secara efisien. Namun, berbeda dengan Apache yang bisa memproses PHP secara native melalui modul mod_php, Nginx membutuhkan bantuan prosesor eksternal untuk menjalankan skrip PHP. Di sinilah PHP-FPM (FastCGI Process Manager) berperan.
Mengintegrasikan Nginx dengan PHP-FPM adalah konfigurasi standar untuk aplikasi web PHP yang performan. Proses ini mungkin terdengar kompleks di awal, tetapi dengan panduan yang tepat, Anda akan bisa menyiapkannya dengan cepat. Artikel ini akan memandu Anda langkah demi langkah tentang cara mengkonfigurasi Nginx untuk bekerja dengan PHP-FPM di sistem operasi Ubuntu.
Kita akan membahas mulai dari instalasi, konfigurasi Nginx server block, hingga tips untuk mengoptimalkan dan mengamankan setup Anda. Jadi, jika Anda ingin website PHP Anda berjalan lebih cepat dan stabil di Nginx, mari kita mulai!
Prasyarat
Sebelum kita memulai, pastikan Anda memiliki:
- Server Ubuntu (disarankan versi LTS seperti 22.04 atau 24.04).
- Akses SSH ke server dengan hak akses
sudo. - Domain atau alamat IP server yang bisa diakses publik (opsional, untuk pengujian).
Langkah 1: Instalasi Nginx
Pertama, kita perlu menginstal Nginx. Nginx tersedia di repositori default Ubuntu, jadi proses instalasinya cukup mudah.
Perbarui daftar paket dan instal Nginx:
sudo apt update
sudo apt install nginx -y
Setelah instalasi selesai, Nginx seharusnya sudah otomatis berjalan. Anda bisa memverifikasinya:
systemctl status nginx
Jika statusnya ‘active (running)’, berarti Nginx sudah siap. Anda juga bisa mencoba mengakses alamat IP server Anda di browser. Anda akan melihat halaman “Welcome to Nginx!”.
Langkah 2: Instalasi PHP-FPM
Selanjutnya, kita akan menginstal PHP-FPM. PHP-FPM adalah implementasi FastCGI yang khusus dirancang untuk PHP, yang berfungsi sebagai “jembatan” antara Nginx dan interpreter PHP.
Kita akan menginstal PHP versi 8.1 (versi yang cukup umum dan stabil saat ini). Anda bisa menyesuaikannya dengan versi PHP yang Anda inginkan (misalnya php8.2-fpm).
sudo apt install php8.1-fpm php8.1-mysql php8.1-cli php8.1-curl php8.1-gd php8.1-mbstring php8.1-xml php8.1-zip -y
Penjelasan paket yang diinstal:
php8.1-fpm: Ini adalah inti dari PHP-FPM.php8.1-mysql: Ekstensi untuk konektivitas database MySQL/MariaDB.php8.1-cli: PHP Command Line Interface, berguna untuk menjalankan skrip PHP dari terminal.php8.1-curl,php8.1-gd,php8.1-mbstring,php8.1-xml,php8.1-zip: Ekstensi PHP umum yang sering dibutuhkan oleh berbagai aplikasi.
Setelah PHP-FPM terinstal, ia juga akan otomatis berjalan sebagai layanan. Verifikasi statusnya:
systemctl status php8.1-fpm
Pastikan statusnya ‘active (running)’.
Langkah 3: Konfigurasi Nginx untuk PHP-FPM
Sekarang adalah bagian krusial: mengkonfigurasi Nginx agar tahu cara meneruskan permintaan file PHP ke PHP-FPM. Kita akan membuat atau memodifikasi server block Nginx.
Membuat Direktori Root Website
Untuk contoh ini, kita akan membuat direktori root website di /var/www/nama_domain_anda. Ganti nama_domain_anda dengan nama domain atau IP server Anda.
sudo mkdir -p /var/www/nama_domain_anda
Berikan hak akses yang sesuai agar Nginx bisa membaca file:
sudo chown -R $USER:$USER /var/www/nama_domain_anda
sudo chmod -R 755 /var/www/nama_domain_anda
Membuat File Konfigurasi Nginx Server Block
File konfigurasi Nginx untuk server block biasanya berada di /etc/nginx/sites-available/. Setelah dibuat, kita akan membuat symlink ke /etc/nginx/sites-enabled/.
Buat file konfigurasi baru. Ganti nama_domain_anda dengan domain Anda.
sudo nano /etc/nginx/sites-available/nama_domain_anda
Tempel konfigurasi berikut ke dalam file. Pastikan untuk menyesuaikan server_name dan root.
server {
listen 80;
listen [::]:80;
server_name nama_domain_anda www.nama_domain_anda;
root /var/www/nama_domain_anda;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
# Optional: Tambahkan konfigurasi ini untuk mengamankan file .htaccess jika ada
location ~ /\.ht {
deny all;
}
}
Beberapa penjelasan penting dari konfigurasi di atas:
listen 80;: Nginx akan mendengarkan koneksi di port 80 (HTTP).server_name nama_domain_anda www.nama_domain_anda;: Tentukan nama domain yang akan dilayani oleh server block ini.root /var/www/nama_domain_anda;: Direktori tempat file website Anda berada.index index.php index.html index.htm;: Urutan file yang akan dicari Nginx ketika direktori diakses. Kita letakkanindex.phpdi depan agar diprioritaskan.location / { try_files $uri $uri/ =404; }: Konfigurasi standar untuk menangani URL. Ini mencoba mencari file yang cocok dengan URL, lalu direktori, dan jika tidak ditemukan, mengembalikan 404. Ini juga penting untuk clean URL atau pretty URL pada framework seperti Laravel atau WordPress.location ~ \.php$ { ... }: Ini adalah bagian terpenting.~ \.php$memberitahu Nginx untuk mencocokkan semua permintaan yang berakhiran.php.include snippets/fastcgi-php.conf;: Mengimpor konfigurasi FastCGI standar dari Nginx. File ini berisi beberapa parameter penting sepertifastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;.fastcgi_pass unix:/run/php/php8.1-fpm.sock;: Ini memberitahu Nginx untuk meneruskan permintaan file PHP ke soket PHP-FPM yang kita instal sebelumnya. Pastikan jalur soket ini benar (tergantung versi PHP yang Anda instal).
Mengaktifkan Server Block dan Restart Nginx
Setelah menyimpan konfigurasi, kita perlu mengaktifkan server block ini dengan membuat symlink ke direktori sites-enabled:
sudo ln -s /etc/nginx/sites-available/nama_domain_anda /etc/nginx/sites-enabled/
Hapus konfigurasi default Nginx agar tidak bentrok:
sudo unlink /etc/nginx/sites-enabled/default
Selalu uji konfigurasi Nginx Anda untuk memastikan tidak ada kesalahan sintaks:
sudo nginx -t
Jika Anda melihat pesan syntax is ok dan test is successful, berarti konfigurasi Anda benar. Sekarang, muat ulang Nginx agar perubahan diterapkan:
sudo systemctl reload nginx
Langkah 4: Uji Coba Konfigurasi
Untuk memastikan Nginx berhasil memproses file PHP, kita akan membuat file phpinfo.php di direktori root website Anda.
sudo nano /var/www/nama_domain_anda/phpinfo.php
Isi file tersebut dengan baris berikut:
<?php
phpinfo();
?>
Simpan dan tutup file.
Sekarang, buka browser Anda dan akses http://nama_domain_anda/phpinfo.php (ganti nama_domain_anda dengan domain atau alamat IP server Anda).
Jika Anda melihat halaman informasi PHP, selamat! Nginx Anda telah berhasil dikonfigurasi untuk bekerja dengan PHP-FPM.
Setelah pengujian selesai, sangat disarankan untuk menghapus file phpinfo.php karena dapat mengungkapkan informasi sensitif server Anda kepada publik:
sudo rm /var/www/nama_domain_anda/phpinfo.php
Masalah yang Sering Terjadi
Dalam praktiknya, konfigurasi Nginx dan PHP-FPM seringkali menghadapi beberapa kendala umum. Berikut adalah beberapa masalah yang paling sering muncul dan cara mengatasinya:
1. Nginx Mengembalikan 502 Bad Gateway
Gejala: Ketika Anda mengakses file PHP, browser menampilkan halaman “502 Bad Gateway”.
Penyebab: Ini hampir selalu berarti Nginx tidak bisa berkomunikasi dengan PHP-FPM. Penyebab umumnya adalah PHP-FPM tidak berjalan, atau jalur soket yang dikonfigurasi di Nginx salah.
Solusi:
- Periksa status PHP-FPM:
sudo systemctl status php8.1-fpm. Jika tidak berjalan, coba mulai:sudo systemctl start php8.1-fpm. - Pastikan jalur soket di Nginx (
fastcgi_pass unix:/run/php/php8.1-fpm.sock;) cocok dengan jalur soket di konfigurasi PHP-FPM. Anda bisa menemukan jalur soket di file/etc/php/8.1/fpm/pool.d/www.conf(cari baris yang dimulai denganlisten =). - Periksa permission soket. Kadang Nginx tidak punya izin untuk mengakses soket PHP-FPM. Pastikan grup
www-data(grup default Nginx) memiliki izin yang benar. Anda bisa mengubah barislisten.ownerdanlisten.groupdi filewww.confmenjadiwww-datadanlisten.mode = 0660, lalu restart PHP-FPM.
2. Nginx Mengembalikan 403 Forbidden
Gejala: Browser menampilkan halaman “403 Forbidden”.
Penyebab: Nginx tidak memiliki izin untuk membaca file atau direktori root website Anda, atau tidak dapat menemukan file index.
Solusi:
- Periksa hak akses direktori root:
sudo chmod -R 755 /var/www/nama_domain_andadansudo chown -R www-data:www-data /var/www/nama_domain_anda(atau user Nginx yang sesuai). - Pastikan file
index.php(atauindex.html) ada di direktori root jika Anda mengakses domain tanpa menyebutkan nama file.
3. File PHP Diunduh alih-alih Dieksekusi
Gejala: Ketika mengakses file PHP, browser meminta Anda untuk mengunduh file tersebut, bukan menampilkannya.
Penyebab: Ini menunjukkan bahwa Nginx tidak meneruskan permintaan file PHP ke PHP-FPM. Biasanya ada kesalahan dalam blok location ~ \.php$.
Solusi:
- Periksa ulang blok
location ~ \.php$di konfigurasi Nginx Anda. Pastikan tidak ada kesalahan ketik atau baris yang terlewat. - Pastikan
include snippets/fastcgi-php.conf;danfastcgi_pass unix:/run/php/php8.1-fpm.sock;ada dan benar. - Cek apakah ada blok
locationlain yang mungkin bentrok atau menangkap permintaan PHP lebih dulu.
4. Nginx Mengembalikan 404 Not Found
Gejala: Browser menampilkan “404 Not Found” untuk semua URL atau hanya untuk file PHP.
Penyebab: Ini bisa berarti Nginx tidak dapat menemukan file yang diminta atau direktori root yang salah dikonfigurasi.
Solusi:
- Pastikan direktori
rootdi konfigurasi Nginx Anda menunjuk ke lokasi yang benar dari file website Anda (misalnya/var/www/nama_domain_anda). - Periksa apakah file yang Anda coba akses benar-benar ada di direktori tersebut.
- Jika ini terjadi pada clean URL (misalnya
/artikel/judul-artikel), pastikan konfigurasilocation / { try_files $uri $uri/ =404; }sudah benar. Untuk aplikasi seperti WordPress, Anda mungkin perlu menambahkantry_files $uri $uri/ /index.php?$args;.
Setelah melakukan perubahan konfigurasi atau pemecahan masalah, selalu ingat untuk menguji konfigurasi Nginx dengan sudo nginx -t dan muat ulang dengan sudo systemctl reload nginx.
Pengalaman dan Pertimbangan Praktis
Mengkonfigurasi Nginx dengan PHP-FPM adalah langkah awal yang solid, tetapi ada beberapa pertimbangan praktis dan best practice yang sering saya terapkan dalam project nyata untuk performa dan keamanan optimal.
Keamanan PHP-FPM
- Batasi Izin Soket: Secara default, PHP-FPM biasanya membuat soket UNIX dengan izin yang memadai. Namun, jika Anda menggunakan TCP (
127.0.0.1:9000), pastikan firewall Anda membatasi akses ke port tersebut hanya dari localhost. open_basedir: Di file konfigurasiwww.confPHP-FPM, Anda bisa mengaturphp_admin_value[open_basedir] = /var/www/nama_domain_anda:/tmp. Ini membatasi PHP hanya bisa mengakses file di direktori spesifik tersebut, mencegah serangan yang mencoba membaca file di luar direktori root.- Disable Fungsi Berbahaya: Di
php.iniatau konfigurasi PHP-FPM, pertimbangkan untuk menonaktifkan fungsi PHP yang sering disalahgunakan dalam serangan, sepertiexec,shell_exec,passthru,system,proc_open,popen,symlink,dl,eval(jika tidak diperlukan). Gunakandisable_functions = exec,shell_exec,passthru,.... - Sembunyikan Versi PHP: Di
php.ini, aturexpose_php = Off. Ini akan mencegah PHP menampilkan versinya di header HTTP, mengurangi informasi yang bisa dieksploitasi penyerang.
Performa dan Skalabilitas
- Optimalisasi PHP-FPM Pool: File
/etc/php/8.1/fpm/pool.d/www.confberisi konfigurasi worker PHP-FPM. Sesuaikan parameter sepertipm.max_children,pm.start_servers,pm.min_spare_servers, danpm.max_spare_serversberdasarkan sumber daya server (RAM dan CPU) dan beban traffic aplikasi Anda. Monitor penggunaan RAM dan CPU untuk menemukan konfigurasi yang pas. Terlalu banyak child process bisa menghabiskan RAM, terlalu sedikit bisa menyebabkan antrean. - OPcache: PHP OPcache adalah ekstensi bawaan PHP yang mengoptimalkan performa dengan menyimpan bytecode skrip PHP yang sudah dikompilasi di memori. Pastikan ini diaktifkan di
php.iniAnda (biasanya sudah aktif secara default). - Cache Nginx: Untuk aset statis (CSS, JS, gambar), Nginx sangat efisien dalam melayani dari cache. Konfigurasi
expiresdanadd_header Cache-Controlakan sangat membantu.
Manajemen Multi-Versi PHP
Banyak developer, terutama yang menangani beberapa proyek, perlu menjalankan aplikasi dengan versi PHP yang berbeda di satu server. Ini sangat mungkin dengan PHP-FPM.
- Instal beberapa versi PHP-FPM (misalnya
php7.4-fpm,php8.1-fpm,php8.2-fpm). - Setiap versi akan memiliki soketnya sendiri (misalnya
/run/php/php7.4-fpm.sock,/run/php/php8.1-fpm.sock). - Dalam server block Nginx untuk setiap domain/aplikasi, cukup arahkan
fastcgi_passke soket PHP-FPM versi yang sesuai. Ini sangat fleksibel dan sering saya gunakan untuk migrasi atau mendukung legacy applications.
Kapan Menggunakan PostgreSQL atau MySQL/MariaDB?
Pilihan database (PostgreSQL, MySQL, atau MariaDB) tidak secara langsung mempengaruhi konfigurasi Nginx dan PHP-FPM itu sendiri. Nginx dan PHP-FPM fokus pada penyajian aplikasi web. Koneksi ke database ditangani oleh aplikasi PHP melalui ekstensi yang sesuai (misalnya php8.1-pgsql atau php8.1-mysql). Dalam praktiknya, developer bebas memilih database sesuai kebutuhan aplikasi dan preferensi.
Dengan menerapkan pertimbangan praktis ini, Anda tidak hanya memiliki setup yang berfungsi, tetapi juga setup yang efisien, aman, dan siap untuk produksi.
FAQ
Apa itu PHP-FPM?
PHP-FPM (FastCGI Process Manager) adalah implementasi FastCGI tingkat lanjut untuk PHP yang mengelola proses PHP untuk menerima permintaan dari web server seperti Nginx. Ia bertindak sebagai “jembatan” yang menerjemahkan permintaan HTTP dari Nginx ke proses PHP yang bisa mengeksekusi skrip, lalu mengirimkan hasilnya kembali ke Nginx.
Mengapa Nginx tidak bisa memproses PHP secara langsung?
Nginx dirancang sebagai web server yang sangat efisien dalam menyajikan konten statis dan bertindak sebagai reverse proxy. Nginx tidak memiliki modul bawaan untuk menginterpretasikan dan mengeksekusi skrip PHP secara internal, tidak seperti Apache dengan mod_php-nya. Oleh karena itu, Nginx perlu meneruskan tugas eksekusi PHP ke prosesor eksternal seperti PHP-FPM.
Apa perbedaan antara fastcgi_pass unix:/run/php/phpX.X-fpm.sock dan fastcgi_pass 127.0.0.1:9000?
Keduanya adalah cara untuk Nginx berkomunikasi dengan PHP-FPM. unix:/run/php/phpX.X-fpm.sock menggunakan soket UNIX domain, yang berarti komunikasi terjadi melalui file di sistem file lokal. Ini umumnya sedikit lebih cepat dan lebih aman karena tidak melibatkan network stack TCP/IP. Sementara itu, 127.0.0.1:9000 menggunakan koneksi TCP/IP melalui loopback interface lokal di port 9000. Keduanya bekerja dengan baik di lingkungan lokal, tetapi soket UNIX domain sering menjadi pilihan utama untuk performa dan keamanan yang sedikit lebih baik.
Bagaimana cara mengamankan konfigurasi Nginx PHP-FPM?
Ada beberapa langkah penting untuk mengamankan konfigurasi Anda: batasi akses PHP-FPM (gunakan soket UNIX dan batasi izin), gunakan open_basedir untuk membatasi akses PHP ke direktori tertentu, nonaktifkan fungsi PHP yang berbahaya, sembunyikan versi PHP dengan expose_php = Off, dan pastikan izin file/direktori web Anda sesuai.
Kesimpulan
Mengkonfigurasi Nginx dengan PHP-FPM adalah setup standar dan fundamental untuk menjalankan aplikasi PHP modern dengan performa tinggi. Dengan mengikuti panduan langkah demi langkah ini, Anda telah berhasil mengintegrasikan kedua komponen ini, memungkinkan Nginx untuk menyajikan file PHP secara efisien dan aman.
Ingatlah bahwa setiap lingkungan memiliki kebutuhan uniknya. Jangan ragu untuk bereksperimen dengan pengaturan PHP-FPM pool, dan selalu prioritaskan keamanan server Anda. Dengan Nginx dan PHP-FPM, website Anda kini memiliki fondasi yang kuat untuk skalabilitas dan kecepatan. Ini adalah salah satu konfigurasi pertama yang akan saya terapkan setiap kali membangun server web baru untuk aplikasi PHP.
TAGS: Nginx, PHP, PHP-FPM, Web Server, Server Konfigurasi, DevOps, Linux, Ubuntu, Developer Tools


