Setup Nginx + PHP-FPM untuk Laravel

Setup Nginx + PHP-FPM untuk Laravel bertujuan agar domain publik bisa menjalankan aplikasi Laravel dengan benar. Jawaban cepatnya: arahkan root Nginx ke folder public, gunakan try_files ke index.php, hubungkan request PHP ke socket PHP-FPM, blokir file tersembunyi, lalu reload Nginx dan PHP-FPM.

Kesalahan paling umum saat pemula deploy Laravel adalah menganggap Nginx hanya perlu diarahkan ke folder project. Di Laravel, entry point aplikasi ada di public/index.php, sehingga folder public harus menjadi document root.

Peran Nginx dan PHP-FPM

Nginx dan PHP-FPM punya tugas berbeda:

KomponenTugas
Nginxmenerima request HTTP, melayani file statis, meneruskan PHP ke PHP-FPM
PHP-FPMmenjalankan kode PHP Laravel
Laravelmemproses route, middleware, controller, model, dan view

Alurnya:

Browser -> Nginx -> PHP-FPM -> Laravel -> Response

Nginx tidak menjalankan PHP sendiri. Nginx meneruskan file PHP ke PHP-FPM melalui socket atau port.

Struktur Project yang Benar

Misalnya project berada di:

/var/www/toko-laravel

Maka document root Nginx harus:

/var/www/toko-laravel/public

Isi folder utama seperti .env, vendor, storage, dan app tidak boleh menjadi document root publik.

Konfigurasi Nginx Laravel

Buat file konfigurasi, misalnya:

sudo nano /etc/nginx/sites-available/toko-laravel

Isi contoh minimal:

server {
    listen 80;
    server_name tokolaravel.com www.tokolaravel.com;

    root /var/www/toko-laravel/public;
    index index.php index.html;

    charset utf-8;

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

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

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

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Aktifkan site:

sudo ln -s /etc/nginx/sites-available/toko-laravel /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

sudo nginx -t penting karena Nginx akan menolak reload jika konfigurasi salah. Baca pesan error barisnya, lalu perbaiki file konfigurasi.

Menentukan Socket PHP-FPM

Bagian ini harus cocok dengan versi PHP di server:

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

Cek socket yang tersedia:

ls /run/php

Contoh output:

php8.2-fpm.sock
php8.3-fpm.sock

Kalau server memakai PHP 8.2, gunakan php8.2-fpm.sock. Kalau socket salah, Nginx biasanya mengembalikan 502 Bad Gateway.

Permission untuk Laravel

Setelah Nginx dan PHP-FPM benar, Laravel tetap butuh permission menulis ke folder tertentu:

cd /var/www/toko-laravel
sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R ug+rw storage bootstrap/cache

Kalau permission salah, error bisa muncul saat Laravel menulis log, cache, session, atau compiled view.

Untuk upload file Laravel, permission saja belum cukup. File publik juga butuh symlink dari public/storage ke storage/app/public. Jika gambar upload menjadi 404 di server, baca Storage Link Laravel Tidak Jalan di Server.

Cek Log Saat Error

Saat halaman error, cek log dari dua sisi:

sudo tail -f /var/log/nginx/error.log
tail -f storage/logs/laravel.log

Nginx log membantu menemukan masalah konfigurasi web server. Laravel log membantu menemukan error aplikasi seperti route, database, view, atau permission.

Contoh Masalah dan Diagnosis

404 untuk Semua Route Kecuali Homepage

Biasanya try_files belum benar. Pastikan ada:

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

Laravel butuh fallback ke index.php agar route seperti /produk/1 masuk ke router Laravel.

502 Bad Gateway

Biasanya Nginx tidak bisa menghubungi PHP-FPM. Cek:

sudo systemctl status php8.3-fpm
ls /run/php

Lalu samakan fastcgi_pass dengan socket yang tersedia.

File .env Bisa Diakses dari Browser

Ini tanda document root salah. Pastikan root mengarah ke folder public, bukan folder utama project.

Kesalahan yang Sering Terjadi

Root Nginx Salah

Ini kesalahan paling berbahaya. Gunakan:

root /var/www/toko-laravel/public;

Bukan:

root /var/www/toko-laravel;

Socket PHP-FPM Tidak Cocok

Jika server punya PHP 8.2 tetapi konfigurasi menunjuk PHP 8.3, request PHP akan gagal.

Lupa Reload Service

Setelah mengubah konfigurasi, jalankan:

sudo nginx -t
sudo systemctl reload nginx
sudo systemctl reload php8.3-fpm

Mengatasi Semua Error dengan chmod 777

chmod 777 membuat folder bisa ditulis siapa saja. Lebih baik atur owner dan group dengan benar.

Pencegahan

  1. Simpan konfigurasi Nginx yang sudah benar sebagai template.
  2. Selalu jalankan nginx -t sebelum reload.
  3. Catat versi PHP-FPM yang dipakai.
  4. Pastikan APP_URL sesuai domain production.
  5. Cek log Nginx dan Laravel sebelum menebak.
  6. Setelah ubah .env, bersihkan dan buat ulang cache config Laravel.

Bacaan Terkait

FAQ

Kenapa Laravel harus diarahkan ke folder public?

Karena public/index.php adalah entry point Laravel. Folder utama project berisi file internal yang tidak boleh diakses langsung dari browser.

Apa penyebab 502 Bad Gateway?

Paling sering karena PHP-FPM mati, socket PHP-FPM salah, atau permission socket tidak bisa diakses Nginx.

Kenapa route Laravel 404 di server?

Biasanya konfigurasi try_files belum mengarah ke /index.php?$query_string, sehingga route tidak diteruskan ke Laravel.

Apakah konfigurasi ini cukup untuk HTTPS?

Belum. Konfigurasi di atas melayani HTTP. Untuk HTTPS, tambahkan sertifikat TLS, misalnya dengan Certbot atau mekanisme dari provider server.

Apakah perlu restart Nginx setiap deploy?

Tidak selalu. Reload Nginx hanya perlu jika konfigurasi Nginx berubah. Untuk perubahan kode Laravel, biasanya cukup update code, install dependency, migrate, build asset, dan bersihkan/optimasi cache.