PHP/Laravel应用EC2到AWS RDS MariaDB连接权限问题排查
Laravel应用EC2部署连接RDS MariaDB权限异常排查
问题场景
部署在AWS EC2的PHP/Laravel应用,通过.env配置AWS托管的RDS MariaDB实例后,执行数据库查询时抛出权限错误:
SQLSTATE[HY000] [2002] Permission denied (SQL: select * from
userswhereid= 1234567 limit 1)
已完成的前置验证(全部通过):
- EC2主机通过Telnet成功连通RDS实例
- 在EC2主机执行命令
mysql -h your-db-instance.x12345abcde.region.rds.amazonaws.com -u your_username -P 3307,可正常连接数据库并执行查询 - 确认
.env文件权限配置符合要求,应用进程可读取
针对性解决方案
1. 核对Laravel数据库端口配置
手动连接时指定了3307端口,但需确认.env中的DB_PORT是否设置为3307——Laravel默认使用3306端口,若RDS实例端口为3307,配置不匹配会直接导致连接失败。
2. 确认RDS数据库用户授权范围
检查RDS数据库用户的授权规则,确保其允许当前EC2主机的IP(或所有IP)访问目标数据库:
执行以下SQL语句查看权限:
SHOW GRANTS FOR 'your_username'@'%';
若权限不足,执行授权语句(替换占位符):
GRANT ALL PRIVILEGES ON your_target_database.* TO 'your_username'@'%'; FLUSH PRIVILEGES;
3. 排查SELinux限制
若EC2主机开启了SELinux,可能会阻止PHP/FPM进程发起网络连接:
- 临时关闭SELinux测试:
setenforce 0 - 若测试有效,永久开启HTTPD数据库连接权限:
setsebool -P httpd_can_network_connect_db 1
4. 清理Laravel配置缓存
如果之前执行过php artisan config:cache,修改.env后必须清除缓存,否则应用会使用旧的配置参数:
php artisan config:clear php artisan cache:clear
5. 明确数据库连接端口配置
在config/database.php中直接指定数据库端口,避免依赖环境变量解析异常:
'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3307'), // 显式指定端口 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), // 保留其他原有配置 ],
内容的提问来源于stack exchange,提问作者Asad Zahidd
相关产品推荐
相关产品推荐

