Laravel 500 Internal Server Error: Penyebab dan Cara Mengatasinya
Laravel 500 Internal Server Error: Apa Penyebabnya?
Laravel 500 Internal Server Error adalah error yang menunjukkan bahwa server mengalami masalah ketika memproses request aplikasi. Kode HTTP 500 sendiri belum menunjukkan penyebab spesifiknya.
Pada Laravel, penyebab sebenarnya biasanya dapat ditemukan di log aplikasi, konfigurasi environment, database, PHP, permission file, atau dependency.
Jika website tiba-tiba menampilkan:
500 Internal Server Error
jangan langsung mengubah kode aplikasi. Langkah pertama adalah mencari error sebenarnya di log Laravel.
Laravel menyediakan mekanisme exception handling dan logging untuk mencatat exception yang terjadi pada aplikasi. (Laravel)
Secara umum, penyebab Laravel 500 Internal Server Error adalah:
- Konfigurasi
.envsalah. APP_KEYbelum tersedia.- Database tidak dapat diakses.
- Permission
storageataubootstrap/cachebermasalah. - Dependency Composer tidak lengkap.
- Versi PHP tidak kompatibel.
- Cache konfigurasi masih menggunakan nilai lama.
- Error pada kode PHP atau Blade.
- Extension PHP yang dibutuhkan belum terpasang.
- Service seperti Redis atau queue mengalami masalah.
Cara Mengatasi Laravel 500 Internal Server Error
1. Cek Log Laravel Terlebih Dahulu
Ini adalah langkah paling penting.
Masuk ke directory aplikasi Laravel:
cd /var/www/laravel-app
Kemudian lihat log terbaru:
tail -n 100 storage/logs/laravel.log
Untuk memantau log secara realtime:
tail -f storage/logs/laravel.log
Cari bagian seperti:
production.ERROR
atau exception seperti:
SQLSTATE
PDOException
Class not found
Permission denied
No application encryption key has been specified
Pesan tersebut biasanya jauh lebih berguna daripada halaman 500 Internal Server Error yang tampil di browser.
Laravel memang dirancang untuk melaporkan exception berdasarkan konfigurasi logging aplikasi. (Laravel)
2. Periksa APP_DEBUG
Jika Anda sedang melakukan debugging di environment development, Anda dapat mengaktifkan:
APP_DEBUG=true
Kemudian:
php artisan optimize:clear
Refresh halaman.
Laravel dapat menampilkan detail exception ketika debug aktif. Namun, jangan mengaktifkan APP_DEBUG=true pada production, karena detail error dapat mengekspos informasi sensitif kepada pengguna. Dokumentasi Laravel secara eksplisit merekomendasikan APP_DEBUG=false di production.
Untuk production:
APP_ENV=production
APP_DEBUG=false
Jika perlu mengetahui penyebab error di production, baca log server daripada menampilkan stack trace kepada pengunjung.
3. Pastikan APP_KEY Sudah Ada
Salah satu penyebab Laravel gagal menjalankan aplikasi adalah application key belum tersedia.
Periksa:
grep APP_KEY .env
Jika belum ada, jalankan:
php artisan key:generate
Kemudian:
php artisan optimize:clear
Jangan mengganti APP_KEY pada aplikasi production secara sembarangan. Perubahan key dapat berdampak pada data yang sebelumnya dienkripsi menggunakan key lama.
4. Periksa File .env
Kesalahan konfigurasi .env sangat sering menyebabkan HTTP 500 setelah deployment.
Periksa konfigurasi utama:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://domainanda.com
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_app
DB_USERNAME=laravel_user
DB_PASSWORD=password_database
Jika menggunakan Redis:
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
Pastikan setiap nilai sesuai dengan environment server.
Kesalahan kecil seperti database name, username, password, host, atau port dapat membuat Laravel gagal melakukan boot atau gagal menjalankan request.
5. Bersihkan Cache Laravel
Jika .env sudah diperbaiki tetapi error tetap muncul, konfigurasi lama mungkin masih tersimpan di cache.
Jalankan:
php artisan optimize:clear
Perintah tersebut berguna untuk membersihkan cache yang dibuat Laravel.
Setelah aplikasi sudah benar, konfigurasi production dapat di-cache kembali:
php artisan optimize
Laravel sendiri merekomendasikan optimize sebagai bagian dari proses deployment production.
Untuk kasus khusus konfigurasi:
php artisan config:clear
Kemudian jika sudah yakin konfigurasi benar:
php artisan config:cache
Perlu diperhatikan bahwa setelah konfigurasi di-cache, .env tidak lagi dibaca secara langsung untuk setiap request; pemanggilan env() seharusnya berada di file konfigurasi Laravel.
6. Cek Koneksi Database
Jika log menunjukkan:
SQLSTATE
atau:
SQLSTATE[HY000]
kemungkinan masalah berasal dari database.
Periksa .env:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_app
DB_USERNAME=laravel_user
DB_PASSWORD=password_database
Pastikan MySQL aktif:
sudo systemctl status mysql
Kemudian coba koneksi:
mysql -u laravel_user -p laravel_app
Jika login gagal, masalahnya bukan pada route Laravel, tetapi pada konfigurasi atau akses database.
Setelah memperbaiki .env:
php artisan optimize:clear
Kemudian coba kembali aplikasi.
7. Periksa Permission storage dan bootstrap/cache
Laravel perlu dapat menulis file pada directory tertentu, terutama:
storage
bootstrap/cache
Pada Ubuntu dengan Nginx dan PHP-FPM, permission yang salah dapat menghasilkan error 500.
Periksa:
ls -la storage
ls -la bootstrap/cache
Atur ownership sesuai user yang digunakan server:
sudo chown -R deploy:www-data /var/www/laravel-app
Kemudian:
sudo chmod -R 775 storage
sudo chmod -R 775 bootstrap/cache
Jika menggunakan struktur user atau PHP-FPM yang berbeda, sesuaikan ownership dengan konfigurasi server.
Hindari solusi seperti:
chmod -R 777 .
Permission 777 bukan solusi ideal untuk production karena memberikan hak akses terlalu luas.
8. Jalankan composer install
Jika error muncul setelah upload atau deployment aplikasi, dependency Composer mungkin belum terpasang dengan benar.
Jalankan:
composer install --no-dev --optimize-autoloader
Kemudian:
php artisan optimize:clear
Jika muncul error seperti:
Class "..." not found
periksa apakah package tersebut memang tersedia di composer.json.
Jika repository sudah memiliki composer.lock, sebaiknya gunakan dependency yang dikunci oleh project daripada melakukan update package secara sembarangan.
9. Periksa Versi PHP
Laravel membutuhkan versi PHP yang sesuai dengan versi framework dan dependency aplikasi.
Periksa:
php -v
Contoh:
PHP 8.x.x
Kemudian periksa requirement project:
cat composer.json
Cari bagian:
"require": {
"php": "..."
}
Jika aplikasi membutuhkan versi PHP tertentu tetapi VPS menggunakan versi berbeda, aplikasi dapat gagal berjalan atau dependency tidak dapat digunakan dengan benar.
Jika menggunakan PHP-FPM, jangan hanya memeriksa PHP CLI.
Periksa juga:
systemctl status php8.x-fpm
Ganti 8.x sesuai versi PHP yang terpasang.
10. Pastikan Extension PHP Lengkap
Laravel dan dependency aplikasi dapat membutuhkan extension PHP tertentu.
Periksa extension:
php -m
Beberapa extension yang umum digunakan:
mbstring
openssl
pdo
tokenizer
xml
ctype
json
curl
fileinfo
Jika menggunakan MySQL, pastikan tersedia:
pdo_mysql
Jika menggunakan Redis, pastikan driver yang diperlukan aplikasi juga tersedia.
Anda dapat mencari error extension yang hilang melalui log Laravel atau output Composer.
11. Periksa Error pada Blade
HTTP 500 juga dapat disebabkan oleh error pada Blade template.
Misalnya ada syntax yang salah:
{{ $user->name }}
ketika object atau property yang digunakan tidak tersedia sesuai konteks aplikasi.
Untuk mengetahui error sebenarnya, lihat:
tail -f storage/logs/laravel.log
Jika error terjadi setelah Anda baru saja mengubah file Blade, controller, model, atau service, fokuskan pemeriksaan pada perubahan terakhir tersebut.
12. Periksa Route dan Controller
Jika hanya satu halaman yang menghasilkan HTTP 500 sedangkan halaman lain normal, kemungkinan besar masalah berada pada kode route, controller, service, query, atau view yang digunakan halaman tersebut.
Periksa route:
php artisan route:list
Kemudian telusuri alurnya:
Request
↓
Route
↓
Controller
↓
Service / Model
↓
Database / Redis / API
↓
View
Jika semua halaman menghasilkan 500, fokuskan pemeriksaan pada konfigurasi aplikasi, bootstrap Laravel, PHP-FPM, permission, atau dependency.
13. Periksa Nginx Error Log
Jika Laravel tidak menghasilkan informasi yang cukup, periksa log Nginx:
sudo tail -f /var/log/nginx/error.log
Perhatikan pesan seperti:
connect() to unix:/run/php/php8.x-fpm.sock failed
atau:
Permission denied
atau:
FastCGI sent in stderr
Jika muncul masalah PHP-FPM, periksa:
sudo systemctl status php8.x-fpm
Kemudian restart jika memang diperlukan:
sudo systemctl restart php8.x-fpm
Pastikan nama service sesuai versi PHP pada server.
14. Periksa Konfigurasi Nginx Laravel
Untuk Laravel, document root Nginx harus menunjuk ke directory:
/var/www/laravel-app/public
Contoh:
server {
listen 80;
server_name domainanda.com;
root /var/www/laravel-app/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.x-fpm.sock;
}
}
Kemudian tes konfigurasi:
sudo nginx -t
Jika valid:
sudo systemctl reload nginx
Kesalahan pada root, try_files, atau socket PHP-FPM dapat menyebabkan aplikasi tidak berjalan sebagaimana mestinya.
15. Jika Menggunakan Redis, Pastikan Redis Aktif
Jika log menunjukkan error seperti:
Connection refused
dan stack trace mengarah ke Redis, periksa service Redis:
sudo systemctl status redis
Tes:
redis-cli ping
Respons normal:
PONG
Kemudian periksa:
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
Jika Laravel dan Redis berada di Docker container berbeda, 127.0.0.1 biasanya bukan hostname Redis. Gunakan nama service Redis yang sesuai konfigurasi Docker.
16. Jika Menggunakan Queue, Periksa Worker
Aplikasi dapat terlihat normal pada beberapa halaman tetapi gagal memproses fitur tertentu karena queue worker bermasalah.
Periksa konfigurasi:
QUEUE_CONNECTION=redis
atau:
QUEUE_CONNECTION=database
Kemudian jalankan worker untuk pengujian:
php artisan queue:work
Jika worker langsung menghasilkan exception, penyebabnya dapat ditemukan dari output tersebut.
Pada production, worker sebaiknya dijalankan menggunakan process manager atau mekanisme service yang dapat melakukan restart otomatis.
17. Jalankan Artisan untuk Memastikan Laravel Bisa Boot
Salah satu cara cepat mengetahui apakah masalah terjadi pada Laravel secara keseluruhan adalah menjalankan:
php artisan about
Jika command tersebut gagal dengan exception, kemungkinan masalah terjadi pada konfigurasi atau proses bootstrap Laravel.
Anda juga dapat menjalankan:
php artisan optimize:clear
Jika command Artisan saja gagal, jangan fokus dulu pada Nginx. Perbaiki error yang muncul dari Artisan.
18. Gunakan Health Check Laravel
Pada versi Laravel yang mendukung health routing, aplikasi dapat menyediakan endpoint health check seperti:
/up
Endpoint tersebut dapat mengembalikan HTTP 200 ketika aplikasi berhasil melakukan boot dan 500 ketika boot gagal. Laravel menyediakan health route ini untuk membantu monitoring aplikasi production.
Contohnya:
curl -I https://domainanda.com/up
Jika hasilnya:
HTTP/2 200
aplikasi berhasil melewati health check.
Jika:
HTTP/2 500
periksa log Laravel untuk mengetahui exception yang menyebabkan aplikasi gagal.
19. Jangan Langsung Menghapus Semua Cache
Ketika mendapatkan HTTP 500, banyak developer langsung menjalankan berbagai command secara acak.
Lebih aman menggunakan urutan:
php artisan optimize:clear
composer install --no-dev --optimize-autoloader
php artisan about
Kemudian periksa:
tail -n 100 storage/logs/laravel.log
Jika aplikasi sudah diperbaiki dan siap production:
php artisan optimize
Laravel menyediakan optimize:clear untuk menghapus cache optimasi dan optimize untuk membangun cache yang diperlukan pada deployment.
Penyebab Laravel 500 Berdasarkan Pesan Error
| Pesan/Error | Kemungkinan Penyebab | Solusi Awal |
|---|---|---|
No application encryption key | APP_KEY belum tersedia | php artisan key:generate |
SQLSTATE | Database bermasalah | Cek konfigurasi DB_* |
Connection refused | Service seperti Redis/MySQL tidak dapat diakses | Cek service dan host/port |
Class not found | Dependency atau autoload bermasalah | composer install |
Permission denied | Permission file/directories | Periksa storage dan bootstrap/cache |
Call to undefined function | Extension PHP belum tersedia | Install extension yang dibutuhkan |
Allowed memory size exhausted | Memory PHP tidak mencukupi | Periksa memory usage dan konfigurasi PHP |
Maximum execution time exceeded | Proses terlalu lama | Periksa query/proses dan konfigurasi PHP |
502 Bad Gateway | PHP-FPM bermasalah | Periksa PHP-FPM dan socket |
Blank/500 setelah perubahan .env | Cache konfigurasi | php artisan optimize:clear |
Checklist Cepat Mengatasi Laravel 500
Jika Anda ingin troubleshooting dengan urutan paling efektif, gunakan checklist berikut:
- Buka
storage/logs/laravel.log. - Cari exception terbaru.
- Periksa
.env. - Pastikan
APP_KEYtersedia. - Pastikan
APP_DEBUG=falsedi production. - Jalankan
php artisan optimize:clear. - Periksa koneksi database.
- Periksa Redis jika digunakan.
- Jalankan
composer install --no-dev --optimize-autoloader. - Periksa versi PHP.
- Periksa extension PHP.
- Periksa permission
storage. - Periksa permission
bootstrap/cache. - Periksa PHP-FPM.
- Periksa Nginx error log.
- Periksa perubahan kode terakhir.
- Jalankan
php artisan about. - Uji kembali aplikasi.
FAQ Laravel 500 Internal Server Error
Apa arti Laravel 500 Internal Server Error?
HTTP 500 berarti server mengalami kondisi yang membuat request tidak dapat diproses dengan normal. Kode 500 sendiri tidak menjelaskan penyebab spesifiknya, sehingga log Laravel atau server perlu diperiksa.
Kenapa Laravel tiba-tiba error 500 setelah deploy?
Penyebab yang umum adalah .env production belum benar, APP_KEY tidak tersedia, dependency belum di-install, permission salah, PHP tidak kompatibel, database tidak dapat diakses, atau konfigurasi Laravel masih menggunakan cache lama.
Bagaimana cara melihat penyebab error 500 Laravel?
Periksa log:
tail -f storage/logs/laravel.log
Jika masalah berkaitan dengan web server, periksa:
sudo tail -f /var/log/nginx/error.log
Apakah APP_DEBUG=true bisa memperbaiki error 500?
Tidak. APP_DEBUG=true hanya membuat detail error lebih terlihat ketika debugging. Pada production, Laravel merekomendasikan APP_DEBUG=false agar informasi sensitif tidak terekspos.
Apakah php artisan optimize:clear aman dijalankan?
Perintah tersebut memang disediakan Laravel untuk membersihkan cache optimasi. Ini sering berguna setelah perubahan .env atau konfigurasi, terutama ketika aplikasi masih menggunakan konfigurasi lama.
Kesimpulan
Laravel 500 Internal Server Error bukan satu jenis error tertentu. Kode tersebut hanya menunjukkan bahwa terjadi masalah ketika aplikasi memproses request.
Cara paling efektif untuk mengatasinya adalah jangan menebak penyebab dari halaman 500. Mulailah dari log:
tail -f storage/logs/laravel.log
Setelah mengetahui exception, periksa komponen yang relevan:
500 Error
↓
Laravel Log
↓
Exception
↓
.env / Database / PHP / Permission / Dependency
↓
Perbaikan
↓
php artisan optimize:clear
↓
Test ulang
Untuk deployment production, pastikan APP_DEBUG=false, konfigurasi .env benar, dependency sudah terpasang, permission sesuai, PHP-FPM dan database aktif, serta log dapat dipantau. Laravel juga menyediakan mekanisme optimasi dan health check yang dapat membantu menjaga aplikasi production tetap mudah dipantau.
Dengan pendekatan tersebut, error Laravel 500 Internal Server Error dapat ditangani berdasarkan penyebab sebenarnya, bukan sekadar mencoba berbagai command secara acak.
