EC2上Laravel执行php artisan migrate遇SQLSTATE[HY000] [2002]连接拒绝问题
Laravel迁移命令数据库连接失败的解决方案
问题场景
在EC2实例上运行Laravel 8.83.23,应用本身运行正常,但通过EC2 Instance Connect连接实例后执行php artisan migrate:status时,出现SQLSTATE[HY000] [2002] Connection refused错误。将.env文件中DB_HOST从127.0.0.1改为localhost时,出现file not found错误,确认.env文件已生效,且已尝试清除artisan缓存。
提供的.env文件内容(注意:文件存在重复配置块)
APP_NAME=Laravel APP_ENV=production APP_KEY=<key> APP_DEBUG=true APP_URL=https://<url>/ LOG_CHANNEL=stack LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=rent DB_USERNAME=root DB_PASSWORD= BROADCAST_DRIVER=log CACHE_DRIVER=file QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 MEMCACHED_HOST=127.0.0.1 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 # 以下配置块完全重复,建议删除 APP_NAME=Laravel APP_ENV=production APP_KEY=<key> APP_DEBUG=true APP_URL=https://<url>/ LOG_CHANNEL=stack LOG_LEVEL=debug DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=rent DB_USERNAME=root DB_PASSWORD= BROADCAST_DRIVER=log CACHE_DRIVER=file QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120 MEMCACHED_HOST=127.0.0.1 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_MAILER=smtp MAIL_HOST=mailhog MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=null MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
解决方案步骤
1. 检查MySQL服务状态
确认EC2上的MySQL服务是否正在运行:
sudo systemctl status mysqld # 针对MariaDB用以下命令 sudo systemctl status mariadb
如果服务未启动,执行启动命令并设置开机自启:
sudo systemctl start mysqld sudo systemctl enable mysqld
2. 验证MySQL端口监听
确认MySQL正在监听3306端口:
netstat -tuln | grep 3306 # 或用ss命令 ss -tuln | grep 3306
如果输出中没有127.0.0.1:3306或:::3306,说明MySQL未绑定本地端口,需要修改MySQL配置文件(通常是/etc/my.cnf或/etc/mysql/my.cnf):
- 找到
bind-address配置项,设置为127.0.0.1 - 注释掉
skip-networking(如果存在)
修改后重启MySQL服务:
sudo systemctl restart mysqld
3. 修复.env文件重复配置
你的.env文件存在完全重复的配置块,这可能导致Laravel读取配置异常,必须删除重复的前半部分配置,保留完整的一份即可。
4. 配置MySQL Socket文件(解决localhost连接报错)
当DB_HOST设为localhost时,Laravel会尝试通过socket文件连接,而非TCP端口。出现file not found说明socket路径不正确:
- 查找MySQL socket文件位置:
mysql -uroot -p -e "show variables like 'socket'"
- 在.env文件中添加
DB_SOCKET配置,指向找到的路径,例如:
DB_SOCKET=/var/lib/mysql/mysql.sock
5. 验证数据库用户权限
确认root用户可本地访问rent数据库:
mysql -uroot -p rent
如果无法登录,为root用户授予本地访问权限:
GRANT ALL PRIVILEGES ON rent.* TO 'root'@'localhost' IDENTIFIED BY ''; FLUSH PRIVILEGES;
(root密码为空,执行时直接按回车即可)
6. 清除缓存并测试
完成上述操作后,重新清除Laravel缓存:
php artisan config:clear php artisan cache:clear
再次执行迁移状态命令:
php artisan migrate:status
内容的提问来源于stack exchange,提问作者Smalltalkman
相关产品推荐
相关产品推荐

