Website

Cara Deploy Laravel di Nginx dengan PHP-FPM

06 Jun 2026 Administrator
Header Hero

Cara Deploy Laravel di Nginx dengan PHP-FPM

Panduan Produksi LEMP Stack: Optimalisasi Socket PHP-FPM, Pemetaan Server Block Nginx, Isolasi Izin Berkas Storage, dan Otomatisasi SSL HTTPS

Membuat aplikasi berbasis framework Laravel di lingkungan lokal (*localhost*) memang menyenangkan. Namun, memindahkannya ke dalam server produksi **VPS (Virtual Private Server)** dengan arsitektur LEMP Stack (Linux, Nginx, MySQL, PHP-FPM) membutuhkan ketelitian ekstra. Kesalahan kecil pada konfigurasi hak akses folder, penataan blok server web, atau miskonfigurasi soket PHP-FPM akan langsung memicu galat populer seperti *502 Bad Gateway* atau *403 Forbidden*.

Berbeda dengan framework PHP konvensional, Laravel menuntut struktur perutean yang tersentralisasi pada folder public/index.php serta membutuhkan isolasi perizinan (*file permissions*) yang ketat pada direktori penyimpanan cache harian. Panduan ini dirancang untuk memandu Anda melakukan proses deployment Laravel secara bertahap, mulai dari instalasi dependensi Composer, sinkronisasi berkas `.env`, penyusunan skrip virtual host Nginx, hingga otomatisasi sertifikat SSL Let's Encrypt gratis demi mengamankan trafik global pengguna.

Prasyarat Awal: Pastikan Anda telah memiliki VPS aktif dengan Ubuntu Server, hak otorisasi sudo, serta nama domain asli yang catatan DNS-nya (*A Record*) sudah diarahkan ke alamat IP publik VPS Anda.

1. Instalasi Web Server dan Ekstensi Ekstensi PHP Mandatori

Langkah pertama adalah memperbarui indeks repositori Linux, lalu memasang Nginx beserta modul ekstensi PHP-FPM yang diwajibkan oleh core engine Laravel agar fungsi enkripsi biner dan kompresi zip berjalan normal:

# 1. Perbarui indeks paket sistem operasi Linux
sudo apt update && sudo apt upgrade -y

# 2. Pasang Nginx web server, Git, dan pustaka ekstensi PHP esensial Laravel
sudo apt install nginx git curl php-fpm php-mysql php-mbstring php-xml php-bcmath php-curl php-zip php-gd php-intl -y

# 3. Memasang Composer secara global ke dalam sistem
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
sudo chmod +x /usr/local/bin/composer

2. Kloning Source Code dan Penyusunan File Environment (.env)

Buat folder direktori kerja utama web server, gunakan Git untuk menarik repositori proyek Laravel Anda, lalu lakukan instalasi dependensi vendor serta kuncian enkripsi aplikasi:

# 1. Membuat direktori penampung (Ganti nama-app dengan nama proyek Anda)
sudo mkdir -p /var/www/nama-app
sudo chown -R $USER:$USER /var/www/nama-app
cd /var/www/nama-app

# 2. Kloning repositori proyek Laravel dari GitHub Anda
git clone https://github.com/username-anda/repo-laravel.git .

# 3. Jalankan instalasi dependensi PHP via Composer dengan optimasi produksi
composer install --optimize-autoloader --no-dev

# 4. Menyusun berkas konfigurasi rahasia produksi .env
cp .env.example .env
nano .env

Di dalam teks editor `.env`, pastikan Anda mengubah parameter sensitif berikut menjadi mode produksi aman:

APP_ENV=production
APP_DEBUG=false  # Kritis: Wajib di-set ke false agar celah bug kode tidak terekspos ke luar publik
APP_URL=https://suryassh.net

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=db_laravel_app
DB_USERNAME=user_laravel
DB_PASSWORD=PasswordKuatDatabase123!

Simpan berkas, kemudian eksekusi pembuatan key hash generator sistem serta kompilasi cache untuk mempercepat performa kueri framework:

# Membuat APP_KEY enkripsi baru
php artisan key:generate

# Mengompilasi cache konfigurasi dan rute demi memangkas beban kerja I/O disk server
php artisan config:cache
php artisan route:cache
php artisan view:cache
File Permissions

3. Isolasi Izin Akses Folder Berkas (Storage Hardening)

Laravel membutuhkan otorisasi tulis-baca (*write-read*) pada direktori internal penampung log dan render sesi data. Salah menyusun perizinan berkas di area ini akan berujung pada kemunculan layar kosong pemicu galat *permission denied*:

# 1. Ubah kepemilikan grup folder proyek secara penuh ke user web server nginx (www-data)
sudo chown -R www-data:www-data /var/www/nama-app

# 2. Berikan kelonggaran izin tulis khusus untuk direktori penyimpanan internal dan cache bootstrap
sudo chmod -R 775 /var/www/nama-app/storage
sudo chmod -R 775 /var/www/nama-app/bootstrap/cache

4. Penyusunan Berkas Server Block Nginx Kustom Laravel

Arsitektur keamanan Laravel mengharuskan pintu utama publik diarahkan ke folder /public, bukan ke folder root proyek. Buat file konfigurasi *Virtual Host* baru:

sudo nano /etc/nginx/sites-available/nama-app

Tempel struktur template blok server RESTful Nginx yang telah dioptimalkan khusus untuk perutean URL dinamis Laravel berikut:

server {
    listen 80;
    server_name suryassh.net www.suryassh.net;
    
    # CRITICAL: Pintu utama wajib mengarah simetris ke folder public bawaan laravel
    root /var/www/nama-app/public;
    index index.php index.html index.htm;

    access_log /var/log/nginx/laravel.access.log;
    error_log /var/log/nginx/laravel.error.log;

    location / {
        # Amankan struktur perutean router agar diteruskan ke public/index.php
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        # Mengaitkan jabat tangan biner eksekusi kode ke file socket PHP-FPM sistem (Sesuaikan versi PHP Anda)
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Blokir akses publik langsung ke file tersembunyi seperti .git atau .htaccess
    location ~ /\.ht { deny all; }
    
    # Keamanan Tambahan UI Headers
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
}

Aktifkan konfigurasi dengan membuat simbolik tautan, jalankan pengetesan validasi sintaks, lalu muat ulang Nginx web server:

sudo ln -s /etc/nginx/sites-available/nama-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
SSL Enkripsi

5. Otomatisasi Klaim Sertifikat SSL HTTPS Let's Encrypt

Untuk membuang status peringatan bahaya di peramban browser pengguna, gunakan utilitas otomasi klien Certbot Nginx untuk memasang enkripsi sertifikat SSL secara otomatis harian:

# 1. Pasang paket biner Certbot Client untuk Nginx web server
sudo apt install certbot python3-certbot-nginx -y

# 2. Trigger verifikasi kepemilikan domain kustom harian Anda
sudo certbot --nginx -d suryassh.net -d www.suryassh.net

*Ikuti interaksi petunjuk pada layar terminal: Masukkan email pemulihan Anda, setujui aturan lisensi pengembang, dan pilih opsi nomor 2 (Redirect) agar Certbot otomatis memodifikasi file konfigurasi Nginx guna mengalihkan seluruh trafik HTTP biasa ke jalur aman biner HTTPS.*

6. Sinkronisasi Skema Pangkalan Data (Database Migrations)

Langkah terakhir adalah memprovisikan database kosong di sistem DBMS MySQL Anda, kemudian mengeksekusi migrasi tabel database bawaan dari file rancangan proyek Laravel Anda:

# 1. Masuk ke MySQL console untuk membuat skema database terisolasi baru
sudo mysql -e "CREATE DATABASE db_laravel_app; CREATE USER 'user_laravel'@'localhost' IDENTIFIED BY 'PasswordKuatDatabase123!'; GRANT ALL PRIVILEGES ON db_laravel_app.* TO 'user_laravel'@'localhost'; FLUSH PRIVILEGES;"

# 2. Pindah ke direktori utama aplikasi dan eksekusi perintah migrasi tabel database
cd /var/www/nama-app
php artisan migrate --force

*Catatan: Parameter bendera --force mutlak diperlukan saat mengeksekusi migrasi di lingkungan produksi (*production environment*) untuk memotong peringatan kofirmasi interaktif sistem.*

Protokol Investigasi Kerusakan (Troubleshooting Deployment)

Mendapati kendala visual halaman tidak merespons dengan normal? Jangan panik, lakukan pelacakan bug harian menggunakan 3 alur audit teknis berikut:

  • Solusi Galat Amukan "502 Bad Gateway": Kendala ini menandakan Nginx gagal berkomunikasi dengan pemroses biner PHP-FPM di latar belakang. Periksa apakah nomor versi file soket `.sock` yang tertulis pada berkas konfigurasi Server Block Nginx sudah sinkron dengan versi PHP-FPM yang aktif menyala di VPS Linux Anda. Cek statusnya via CLI perintah:
    sudo systemctl status php8.1-fpm.
  • Solusi Kendala Halaman Putih Kosong (*White Screen of Death*): Masalah ini umumnya dipicu oleh kegagalan pembacaan kuncian data pangkalan data database atau masalah hak akses folder cache. Karena status `APP_DEBUG` diset ke false di server produksi, rincian galat tidak akan muncul di browser. Segera intip string pemicu error riilnya lewat log rekam internal Laravel dengan perintah terminal:
    tail -f storage/logs/laravel.log.
  • Otomatisasi Penjadwalan Tugas Task Scheduler (Cron Job): Kerangka kerja Laravel mengonsolidasikan seluruh tugas otomatisasi rutin melalui satu pintu. Agar fungsi pengiriman email massal harian atau pembersihan tabel sampah berjalan otomatis, daftarkan modul penjadwal ke sistem Crontab Linux via perintah crontab -e dan tempel instruksi makro ini di baris terbawah:
    * * * * * cd /var/www/nama-app && php artisan schedule:run >> /dev/null 2>&1
v