All Newbie, Semua Tentang Ilmu

Recent

Cara Install Nginx + PHP-FPM di Ubuntu 24.04

Nginx tidak bisa menjalankan PHP sendiri. Ia meneruskan permintaan berkas .php ke PHP-FPM lewat FastCGI, lalu mengirim hasilnya ke browser. Pemisahan ini yang membuat Nginx hemat memori namun tetap cepat untuk aplikasi dinamis.

Kode PHP pada editor menampilkan fungsi register_sidebar
Foto: Ron23545, CC BY-SA 4.0, via Wikimedia Commons

Ringkasan singkat

  • Pasang nginx + php8.3-fpm.
  • Socket ada di /run/php/php8.3-fpm.sock.
  • Set cgi.fix_pathinfo=0.
  • 502 = socket salah, bukan masalah browser.

Panduan ini memasang Nginx + PHP-FPM 8.3 di Ubuntu 24.04 sampai halaman PHP benar-benar tampil, termasuk penyebab error 502 yang paling sering terjadi.

Yang perlu disiapkan

  • Ubuntu Server 24.04 dengan akses sudo.
  • Port 80 terbuka di firewall.
  • Domain opsional; panduan ini memakai IP server dulu.

1. Pasang paket

sudo apt update
sudo apt install -y nginx php8.3-fpm php8.3-cli php8.3-mysql
systemctl status nginx --no-pager
systemctl status php8.3-fpm --no-pager

Keduanya harus active (running). PHP-FPM membuat socket di /run/php/php8.3-fpm.sock; alamat inilah yang dipakai Nginx.

Alur permintaan Nginx ke PHP-FPM lewat socket FastCGIBrowserklienNginx :80root /var/www/apptry_filesberkas statisdilayani langsungPHP-FPM 8.3socket /run/phpphp8.3-fpm.sockaplikasiPHP
Diagram: Alur permintaan Nginx ke PHP-FPM lewat socket FastCGI

2. Server block pertama

sudo nano /etc/nginx/sites-available/app
server {
    listen 80;
    server_name _;
    root /var/www/app;
    index index.php index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }
}
sudo mkdir -p /var/www/app
sudo ln -s /etc/nginx/sites-available/app /etc/nginx/sites-enabled/app
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t && sudo systemctl reload nginx

3. Uji dengan satu berkas

echo '<?php phpinfo();' | sudo tee /var/www/app/info.php
curl -s http://127.0.0.1/info.php | head -5

Kalau yang keluar justru kode PHP mentah, artinya blok location ~ \.php$ tidak aktif. Kalau keluar 502 Bad Gateway, socket-nya salah atau PHP-FPM mati.

Hapus berkas uji setelah selesai:

sudo rm /var/www/app/info.php

4. Matikan cgi.fix_pathinfo

sudo nano /etc/php/8.3/fpm/php.ini
cgi.fix_pathinfo=0
sudo systemctl restart php8.3-fpm

Nilai 1 membuat PHP mencoba menebak berkas lain saat path tidak valid — perilaku yang pernah dipakai untuk mengeksekusi unggahan berbahaya. Untuk server produksi, 0 adalah pilihan yang benar.

5. Izin berkas

sudo chown -R www-data:www-data /var/www/app
sudo find /var/www/app -type d -exec chmod 755 {} \;
sudo find /var/www/app -type f -exec chmod 644 {} \;

Jangan memakai 777. Kalau aplikasi perlu menulis (folder unggahan atau cache), berikan izin hanya ke folder itu.

6. Log untuk diagnosa

sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/php8.3-fpm.log

Kebiasaan yang menghemat waktu: baca error.log lebih dulu sebelum menebak. Nginx menuliskan path socket yang gagal dan berkas yang tidak ditemukan secara eksplisit.

7. Menambah aplikasi kedua

Buat server block baru dengan root dan server_name berbeda, lalu arahkan trafik berdasarkan domain. Kalau aplikasi berjalan di port sendiri (misal 127.0.0.1:3000), gunakan reverse proxy, bukan PHP-FPM.

8. Menyesuaikan batas unggahan

sudo nano /etc/php/8.3/fpm/php.ini
upload_max_filesize = 32M
post_max_size = 32M
memory_limit = 256M
max_execution_time = 120

Nilai ini sebaiknya lebih kecil daripada client_max_body_size di Nginx. Kalau terbalik, Nginx sudah menolak lebih dulu dengan 413 dan PHP tidak pernah menerima berkasnya. Setelah diubah, restart FPM lalu verifikasi:

sudo systemctl restart php8.3-fpm
php -i | grep upload_max_filesize

9. Pool terpisah untuk aplikasi kedua

Satu pool berjalan dengan user sendiri dan batas worker sendiri. Memisahkannya mencegah satu aplikasi menghabiskan seluruh proses:

sudo cp /etc/php/8.3/fpm/pool.d/www.conf /etc/php/8.3/fpm/pool.d/app2.conf

Ubah nama pool menjadi [app2], sesuaikan user/group, dan ganti listen menjadi /run/php/php8.3-fpm-app2.sock. Server block aplikasi kedua cukup diarahkan ke socket itu.

10. Melihat konfigurasi yang benar-benar dipakai

Setelah banyak perubahan, berkas di sites-available belum tentu sama dengan yang aktif. Dua perintah ini menampilkan hasil akhirnya:

sudo nginx -T | grep -A3 "location ~"
sudo php-fpm8.3 -tt

nginx -T mencetak seluruh konfigurasi gabungan, termasuk yang berasal dari snippets/. Kalau socket di keluaran berbeda dengan dugaanmu, itulah sumber error 502.

Masalah yang sering muncul

GejalaPenyebabSolusi
502 Bad GatewaySocket salah atau FPM matils /run/php/, samakan path di server block
Kode PHP tampil mentahBlok location ~ \.php$ tidak adaTambahkan blok FastCGI, lalu reload
404 untuk semua halamanroot salah atau symlink belum dibuatCek nginx -T | grep root
File not found (dari PHP)SCRIPT_FILENAME tidak cocokPastikan root sama dengan lokasi berkas
Permission deniedBerkas milik user lainchown www-data, jangan 777
Perubahan tidak berlakuLupa reloadsudo nginx -t && sudo systemctl reload nginx

Pertanyaan yang sering diajukan

PHP-FPM atau Apache dengan mod_php?

PHP-FPM lebih hemat memori dan memisahkan proses aplikasi dari web server. Untuk Nginx, PHP-FPM memang satu-satunya pilihan yang wajar.

Bisakah beberapa versi PHP berjalan bersamaan?

Bisa. Pasang php8.2-fpm dan php8.3-fpm, lalu pilih socket berbeda per server block.

Apakah perlu php8.3-mysql?

Hanya kalau aplikasi memakai MySQL/MariaDB. Untuk aplikasi tanpa basis data, paket itu tidak dibutuhkan.

Kenapa phpinfo harus dihapus?

Halaman itu menampilkan versi, modul, dan konfigurasi server. Informasi tersebut membantu penyerang memetakan kelemahan.





0 comments:

Post a Comment