Cara Mengatasi Database Connection Refused pada Laravel
Apa Itu Database Connection Refused?
Error ini muncul ketika Laravel mencoba terhubung ke database, tetapi koneksi ditolak oleh server database.
Contohnya:
SQLSTATE[HY000] [2002] Connection refusedArtinya Laravel sudah mencoba melakukan koneksi, tetapi database tidak menerima koneksi tersebut.
1. Periksa File .env
Hal pertama yang perlu diperiksa adalah konfigurasi database:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=nama_database
DB_USERNAME=nama_user
DB_PASSWORD=passwordUntuk PostgreSQL:
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=nama_database
DB_USERNAME=nama_user
DB_PASSWORD=passwordPastikan:
Nama database benar.
Username benar.
Password benar.
Port sesuai.
Host sesuai dengan lokasi database.
2. Pastikan Database Berjalan
Pada Ubuntu, cek MySQL:
sudo systemctl status mysqlJika belum berjalan:
sudo systemctl start mysqlUntuk PostgreSQL:
sudo systemctl status postgresqlKemudian:
sudo systemctl start postgresqlJika database berhenti, Laravel tentu tidak dapat membuat koneksi.
3. Periksa Port Database
MySQL biasanya menggunakan:
3306PostgreSQL biasanya menggunakan:
5432Cek port yang sedang digunakan:
sudo ss -lntp | grep 3306Untuk PostgreSQL:
sudo ss -lntp | grep 5432Jika tidak ada hasil, kemungkinan database belum listening pada port tersebut.
4. Jangan Selalu Menggunakan localhost
Pada beberapa lingkungan server, perbedaan antara:
DB_HOST=localhostdan:
DB_HOST=127.0.0.1dapat berpengaruh terhadap cara koneksi dibuat.
Untuk koneksi TCP lokal, coba:
DB_HOST=127.0.0.1Jika database menggunakan Unix socket, konfigurasi dapat berbeda.
5. Bersihkan Cache Konfigurasi Laravel
Laravel dapat menggunakan konfigurasi yang sudah dicache.
Setelah mengubah .env, jalankan:
php artisan optimize:clearKemudian coba:
php artisan migrate:statusJika koneksi berhasil, Laravel sudah dapat berkomunikasi dengan database.
6. Pastikan Database Bisa Diakses Manual
Untuk MySQL:
mysql \
-h 127.0.0.1 \
-P 3306 \
-u nama_user \
-pUntuk PostgreSQL:
psql \
-h 127.0.0.1 \
-p 5432 \
-U nama_user \
-d nama_databaseJika koneksi manual juga gagal, masalah kemungkinan berada pada database atau konfigurasi server, bukan Laravel.
7. Periksa Docker
Jika Laravel dan database berjalan di Docker, jangan gunakan:
DB_HOST=127.0.0.1untuk mengakses container database dari container Laravel.
Gunakan nama service Docker.
Contoh:
services:
app:
...
mysql:
image: mysql:8Maka:
DB_HOST=mysql
DB_PORT=3306Karena Laravel harus mengakses service database melalui network Docker.
Contoh:
Laravel Container
↓
mysql:3306
↓
MySQL Container8. Periksa Docker Container
Jalankan:
docker psPastikan container database sedang berjalan.
Jika tidak:
docker compose up -dKemudian periksa log:
docker compose logs mysqlNama service dapat berbeda sesuai konfigurasi docker-compose.yml.
9. Periksa Konfigurasi MySQL
Jika database berada pada server lain, MySQL harus menerima koneksi dari server Laravel.
Periksa konfigurasi:
/etc/mysql/mysql.conf.d/mysqld.cnfCari:
bind-addressKonfigurasi seperti:
bind-address = 127.0.0.1hanya menerima koneksi lokal.
Jika database memang harus menerima koneksi dari server aplikasi lain, konfigurasi network perlu disesuaikan dengan kebutuhan keamanan.
Jangan membuka database ke seluruh internet tanpa firewall dan pembatasan akses.
10. Periksa Firewall
Jika database berada di server berbeda, periksa firewall.
Contohnya menggunakan UFW:
sudo ufw statusJika diperlukan, akses port database sebaiknya dibatasi hanya dari IP server aplikasi.
Hindari membuka:
3306atau:
5432ke seluruh internet tanpa alasan yang jelas.
11. Periksa Username dan Permission
Jika database sudah berjalan tetapi Laravel masih tidak dapat login, periksa user database.
MySQL:
SHOW GRANTS FOR 'nama_user'@'localhost';Jika Laravel berada pada server berbeda, host database user dapat berbeda dari localhost.
Pastikan user memiliki permission yang sesuai terhadap database aplikasi.
12. Periksa Database Host pada Production
Konfigurasi development:
DB_HOST=127.0.0.1belum tentu sama dengan production.
Contohnya:
Laravel Server
↓
Database Server
192.168.1.20Maka:
DB_HOST=192.168.1.20Jika menggunakan cloud database, gunakan hostname atau endpoint yang diberikan oleh provider.
13. Periksa Port Custom
Database tidak selalu menggunakan port default.
Misalnya MySQL menggunakan:
3307Maka:
DB_PORT=3307Pastikan port pada .env sama dengan port yang digunakan database.
14. Jalankan Tes dari Laravel
Setelah konfigurasi diperbaiki:
php artisan migrate:statusatau:
php artisan tinkerKemudian:
DB::connection()->getPdo();Jika tidak menghasilkan error, Laravel sudah berhasil membuat koneksi database.
15. Periksa Log Laravel
Jika masih gagal, periksa:
storage/logs/laravel.logContoh:
tail -f storage/logs/laravel.logLog dapat membantu mengetahui apakah masalah berasal dari:
Host.
Port.
Username.
Password.
Database.
Network.
Permission.
Perbedaan Connection Refused dan Access Denied
Keduanya sering dianggap sama, padahal berbeda.
Connection Refused
Contohnya:
SQLSTATE[HY000] [2002] Connection refusedBiasanya berkaitan dengan:
Database tidak berjalan.
Port salah.
Host salah.
Firewall.
Docker network.
Database tidak listening.
Access Denied
Contohnya:
Access denied for userBiasanya berkaitan dengan:
Username salah.
Password salah.
Permission database.
Host user database tidak sesuai.
Jadi, jangan langsung mengganti password ketika error yang muncul adalah “Connection refused”.
Checklist Troubleshooting
Urutan pemeriksaan yang praktis:
1. Periksa .env
↓
2. Periksa database berjalan
↓
3. Periksa DB_HOST
↓
4. Periksa DB_PORT
↓
5. Tes koneksi manual
↓
6. Clear Laravel config
↓
7. Periksa Docker
↓
8. Periksa firewall
↓
9. Periksa database permission
↓
10. Periksa laravel.logContoh Konfigurasi Laravel Production
Contoh MySQL:
APP_ENV=production
APP_DEBUG=false
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=production_db
DB_USERNAME=production_user
DB_PASSWORD=********Setelah mengubah konfigurasi:
php artisan optimize:clear
php artisan config:cacheJangan menyimpan password database langsung di repository Git.
Jika Menggunakan Laravel + Nginx + MySQL
Arsitektur sederhananya:
Internet
↓
Nginx
↓
PHP-FPM
↓
Laravel
↓
MySQLJika Laravel menghasilkan Connection refused, periksa MySQL terlebih dahulu sebelum mengubah konfigurasi Nginx.
Nginx dan PHP-FPM biasanya bukan penyebab langsung dari koneksi database yang ditolak.
Jika Menggunakan Laravel + Docker
Arsitekturnya:
Browser
↓
Nginx
↓
Laravel Container
↓
MySQL ContainerPastikan:
DB_HOST=mysql
DB_PORT=3306sesuai dengan nama service database pada Docker Compose.
Pengembangan dan Troubleshooting Laravel Bersama Ovla Media
Ovla Media dapat membantu pengembangan dan maintenance aplikasi Laravel, termasuk:
Konfigurasi Laravel production.
Setup MySQL dan PostgreSQL.
Docker Laravel.
Nginx dan PHP-FPM.
Optimasi database.
Redis.
Laravel Queue.
Backup database.
Monitoring server.
Deployment aplikasi.
Dengan konfigurasi server yang tepat, masalah koneksi database dapat ditemukan lebih cepat dan aplikasi menjadi lebih stabil.
Kesimpulan
Error Database Connection Refused pada Laravel umumnya bukan disebabkan oleh kode aplikasi, tetapi karena Laravel tidak dapat terhubung ke server database.
Periksa secara berurutan:
.env.Status database.
Host.
Port.
Docker.
Firewall.
Permission.
Network.
Cache konfigurasi Laravel.
Log aplikasi.
Perintah yang paling berguna untuk memulai pemeriksaan adalah:
php artisan optimize:clear
php artisan migrate:statusJika database dapat diakses secara manual tetapi Laravel masih gagal, fokus pemeriksaan berikutnya adalah konfigurasi .env, cache konfigurasi, dan environment tempat aplikasi Laravel berjalan.
Artikel Terkait
Cara Membuat Backup Database Laravel Otomatis Setiap Hari
Backup database Laravel otomatis membantu melindungi data aplikasi dari kerusakan server, kesalahan pengguna, atau kehilangan data. Dengan Laravel Scheduler dan cron job, proses backup dapat dijalankan secara rutin setiap hari tanpa dilakukan secara manual.
Cara Membuat Sistem Approval Bertingkat di Laravel
Sistem approval bertingkat pada Laravel memungkinkan sebuah pengajuan melewati beberapa tahap persetujuan sebelum dinyatakan selesai. Sistem ini cocok untuk pengajuan cuti, pembelian, reimbursement, dokumen, anggaran, hingga proses bisnis yang membutuhkan persetujuan beberapa level.
Cara Membuat Export Excel dengan Filter Tanggal di Laravel
Export Excel dengan filter tanggal memungkinkan pengguna mengunduh data berdasarkan periode tertentu. Fitur ini cocok untuk laporan transaksi, penjualan, pasien, pembayaran, absensi, dan data operasional lainnya di aplikasi Laravel.