Cara Deploy Laravel ke VPS dengan Nginx, PHP-FPM, dan SSL 2026
Bayangkan Anda baru selesai membuat aplikasi Laravel untuk toko kecil milik kakak. Di laptop semuanya lancar. Lalu muncul pertanyaan klasik: ditaruh di mana supaya bisa diakses pelanggan? Hosting bersama sering terasa sempit untuk Laravel, sementara menyewa server mahal untuk aplikasi yang baru berjalan terasa boros. Jalan tengah yang masuk akal adalah satu VPS kecil yang Anda kelola sendiri.
Dari sisi biaya, satu VPS bisa menampung beberapa aplikasi sekaligus: toko online, dashboard internal, dan situs portofolio. Anda membayar satu server, bukan tiga paket terpisah. Syaratnya hanya satu: Anda tahu cara menatanya dengan benar. Itulah isi panduan ini.
Kita akan menyiapkan Ubuntu, memasang Nginx dan PHP-FPM, menaruh kode Laravel, lalu mengaktifkan HTTPS gratis dari Let's Encrypt. Pelan-pelan saja, setiap langkah dijelaskan alasannya.
Glosarium Singkat Sebelum Mulai
- VPS: server virtual milik Anda sendiri dengan akses penuh (root), terpisah dari pengguna lain.
- Nginx: web server yang menerima permintaan dari browser dan menentukan file mana yang dilayani.
- PHP-FPM: proses PHP yang berjalan terpisah dan dipanggil Nginx setiap kali ada file PHP perlu dieksekusi.
- Composer: pengelola dependensi PHP, tempat Laravel mengambil paket-paketnya.
- SSL/TLS: enkripsi yang mengubah http menjadi https dan menampilkan ikon gembok di browser.
- Let's Encrypt: otoritas sertifikat gratis yang bisa diperbarui otomatis.
- .env: berkas pengaturan rahasia Laravel, seperti kredensial database dan kunci aplikasi.
Analogi Sederhana: Restoran
Anggap server Anda sebuah restoran. Nginx adalah pelayan di depan yang menerima pesanan. PHP-FPM adalah juru masak di dapur yang benar-benar meracik hidangan (menjalankan kode Laravel). Database adalah gudang bahan. Sertifikat SSL ibarat pintu tertutup antara pelanggan dan pelayan, sehingga orang lain tidak bisa menguping pesanan.
Kalau pelayan tidak tahu letak dapur, pesanan tidak sampai. Sebagian besar error 502 dan 404 saat deploy Laravel pada dasarnya adalah masalah komunikasi antara pelayan dan dapur.
Yang Perlu Disiapkan
- Satu VPS Ubuntu 22.04 atau 24.04 dengan akses SSH. Untuk membandingkan opsi vps murah indonesia dengan server di Jakarta, cek halaman harga di vpshosting.id/harga.
- Satu domain yang sudah diarahkan ke IP VPS lewat record A.
- Kode Laravel di repositori Git.
- Sedikit keberanian mengetik di terminal.
Poin Penting: Arahkan record A domain ke IP VPS sebelum meminta sertifikat SSL. Let's Encrypt memverifikasi kepemilikan domain lewat DNS, jadi propagasi yang belum selesai adalah penyebab gagal terbanyak.
Langkah 1: Masuk ke Server dan Amankan Dasar
Masuk lewat SSH, lalu perbarui paket dan buat pengguna non-root. Bekerja terus sebagai root itu seperti membawa semua kunci rumah ke mana-mana.
ssh root@IP_VPS_ANDA
apt update && apt upgrade -y
adduser deploy
usermod -aG sudo deploy
# Firewall: izinkan SSH dan web saja
ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enablePerintah ufw allow 'Nginx Full' baru dikenali setelah Nginx terpasang, jadi jalankan baris firewall setelah langkah 2 bila muncul pesan error profil tidak ditemukan.
Langkah 2: Pasang Nginx, PHP-FPM, dan Ekstensi
Laravel membutuhkan beberapa ekstensi PHP. Pasang sekaligus agar tidak bolak-balik.
apt install -y nginx git unzip curl \
php-fpm php-cli php-mysql php-mbstring php-xml \
php-curl php-zip php-bcmath php-intl
# Cek versi PHP yang terpasang (misal 8.3)
php -v
systemctl status php8.3-fpmCatat versi PHP Anda, karena nama socket PHP-FPM mengikuti versi tersebut. Lalu pasang Composer:
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
composer --versionLangkah 3: Siapkan Database
Untuk contoh ini kita pakai MariaDB. Buat database dan pengguna khusus, jangan memakai root untuk aplikasi.
apt install -y mariadb-server
mysql_secure_installation
mysql -u root -p
CREATE DATABASE tokokakak CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'tokouser'@'localhost' IDENTIFIED BY 'GantiDenganPasswordKuat';
GRANT ALL PRIVILEGES ON tokokakak.* TO 'tokouser'@'localhost';
FLUSH PRIVILEGES;Langkah 4: Tarik Kode dan Pasang Dependensi
Letakkan aplikasi di /var/www. Jalankan sebagai pengguna deploy, bukan root.
sudo mkdir -p /var/www/tokokakak
sudo chown deploy:deploy /var/www/tokokakak
cd /var/www/tokokakak
git clone https://github.com/akun-anda/tokokakak.git .
composer install --no-dev --optimize-autoloader
cp .env.example .env
php artisan key:generateEdit .env dengan nilai produksi. Dua baris ini wajib diperhatikan:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://contoh.com
DB_DATABASE=tokokakak
DB_USERNAME=tokouser
DB_PASSWORD=GantiDenganPasswordKuatSetelah itu jalankan migrasi dan cache konfigurasi:
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cacheLangkah 5: Atur Izin Folder
Nginx dan PHP-FPM berjalan sebagai pengguna www-data. Folder storage dan bootstrap/cache harus bisa ditulis oleh pengguna itu.
sudo chown -R deploy:www-data /var/www/tokokakak
sudo find /var/www/tokokakak -type f -exec chmod 664 {} \;
sudo find /var/www/tokokakak -type d -exec chmod 775 {} \;
sudo chmod -R 775 storage bootstrap/cacheHindari chmod 777. Memang membuat error hilang, tetapi membuka pintu untuk siapa saja.
Langkah 6: Konfigurasi Nginx
Buat berkas virtual host. Perhatikan bahwa root menunjuk ke folder public, bukan ke akar proyek. Ini penting agar .env tidak bisa diunduh lewat browser.
server {
listen 80;
server_name contoh.com www.contoh.com;
root /var/www/tokokakak/public;
index index.php;
charset utf-8;
# Header keamanan dasar
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
location / {
# Semua rute diarahkan ke front controller Laravel
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
# Sesuaikan dengan versi PHP Anda
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
# Blokir file tersembunyi (.env, .git), kecuali .well-known untuk SSL
location ~ /\.(?!well-known).* {
deny all;
}
}Aktifkan situs, uji konfigurasi, lalu muat ulang:
sudo nano /etc/nginx/sites-available/tokokakak
sudo ln -s /etc/nginx/sites-available/tokokakak /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginxBuka domain Anda di browser. Jika halaman Laravel tampil, dapur dan pelayan sudah saling kenal. Sekarang tinggal memasang pintunya.
Langkah 7: Aktifkan SSL Let's Encrypt
Gunakan Certbot. Ia akan meminta sertifikat dan mengubah konfigurasi Nginx secara otomatis.
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d contoh.com -d www.contoh.com
# Pastikan pembaruan otomatis berjalan
sudo systemctl list-timers | grep certbot
sudo certbot renew --dry-runPilih opsi pengalihan otomatis dari HTTP ke HTTPS saat ditanya. Sertifikat berlaku sekitar 90 hari, dan timer bawaan akan memperbaruinya tanpa Anda berbuat apa-apa. Sekali pasang, selesai.
Langkah 8: Antrean dan Penjadwal
Banyak aplikasi Laravel memakai queue dan scheduler. Untuk scheduler, cukup satu baris cron:
sudo crontab -u www-data -e
# Tambahkan baris ini
* * * * * cd /var/www/tokokakak && php artisan schedule:run >> /dev/null 2>&1Untuk queue worker, gunakan Supervisor agar proses otomatis hidup lagi bila mati:
[program:tokokakak-worker]
command=php /var/www/tokokakak/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/tokokakak-worker.logAlur Update Aplikasi
Setelah live, Anda pasti akan memperbarui kode. Simpan urutan ini sebagai kebiasaan:
cd /var/www/tokokakak
php artisan down
git pull origin main
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan config:cache && php artisan route:cache && php artisan view:cache
php artisan queue:restart
php artisan upKesalahan Umum Pemula
502 Bad Gateway
Biasanya path socket PHP-FPM di konfigurasi Nginx tidak cocok dengan versi PHP yang terpasang. Cek dengan ls /run/php/ dan samakan namanya.
403 atau 404 di semua halaman selain beranda
Hampir pasti try_files belum benar atau root tidak menunjuk ke folder public.
Error 500 tanpa penjelasan
Lihat log, jangan menebak: tail -n 50 storage/logs/laravel.log dan /var/log/nginx/error.log. Penyebab paling sering adalah izin folder storage atau APP_KEY kosong.
Perubahan .env tidak berpengaruh
Karena Anda sudah menjalankan config:cache. Jalankan ulang perintah itu setelah mengubah .env.
APP_DEBUG masih true
Ini bocor ke publik: pesan error lengkap, path server, bahkan sebagian konfigurasi. Pastikan false di produksi.
Sertifikat gagal terbit
Periksa apakah DNS sudah mengarah ke IP yang benar dan port 80 terbuka di firewall. Verifikasi memerlukan keduanya.
Ringkasan Perbandingan Pilihan Hosting
| Aspek | Hosting bersama | VPS |
|---|---|---|
| Kontrol server | Terbatas | Penuh (root) |
| Queue worker dan Supervisor | Sering tidak tersedia | Bisa dipasang bebas |
| Beberapa aplikasi dalam satu server | Tergantung paket | Bisa, dibatasi sumber daya |
| Tanggung jawab perawatan | Dikelola penyedia | Anda sendiri |
Kalau Anda baru belajar dan ingin bereksperimen tanpa takut merusak sesuatu, VPS adalah ruang latihan yang ideal. Anda bisa mengulang instalasi dari nol sesering yang diperlukan. Untuk memilih paket yang cocok dengan kebutuhan aplikasi Anda, lihat opsi terkini di vpshosting.id/harga atau langsung kelola layanan lewat my.vpshosting.id.
Tips Efisiensi Biaya Setelah Live
- Mulai dari yang kecil. Laravel dengan trafik awal biasanya cukup di server sederhana. Tingkatkan sumber daya saat metrik benar-benar menuntut, bukan karena khawatir.
- Gabungkan aplikasi. Satu VPS bisa memakai beberapa virtual host Nginx. Cukup buat berkas konfigurasi baru dan database baru per proyek.
- Aktifkan OPcache. Pengaturan bawaan PHP ini mempercepat eksekusi tanpa menambah sumber daya.
- Pantau penggunaan. Perintah
htopdandf -hmemberi gambaran RAM dan disk sebelum Anda memutuskan upgrade. - Cadangkan rutin. Dump database dan salin folder
storageke tempat lain. Biaya kehilangan data jauh lebih besar daripada biaya backup.
Daftar Periksa Akhir
- Domain mengarah ke IP VPS dan HTTPS aktif.
APP_ENV=productiondanAPP_DEBUG=false.- Root Nginx menunjuk ke folder
public. - Izin
storagedanbootstrap/cachebenar, tanpa 777. - Cache konfigurasi, rute, dan view sudah dibuat.
- Cron scheduler dan Supervisor berjalan bila dipakai.
- Firewall hanya membuka port yang perlu.
- Ada rencana backup yang benar-benar dijalankan.
Deploy pertama memang terasa panjang, tetapi sebagian besar langkah di atas hanya dilakukan sekali. Deploy berikutnya cukup beberapa perintah. Dan begitu Anda paham alurnya, server berikutnya bisa disiapkan dalam waktu singkat.



