AWS EC2实例无法连接RDS数据库问题求助
EC2无法连接RDS MySQL/MariaDB的排查与解决
核心现象
- EC2上Apache运行正常,PHP通过
mysqli()连接RDS超时并返回504错误 - EC2通过SSH执行
mysql命令连接RDS同样超时(ERROR 2003) - 本地Mac的DBeaver可正常连接目标RDS实例
排查与解决步骤
1. 检查RDS安全组入站规则
这是最常见的原因:RDS安全组仅允许了你的本地IP访问,未开放EC2的访问权限。
- 登录AWS控制台→进入RDS服务→选择目标实例→切换到「连接与安全性」标签
- 点击关联的安全组ID,进入安全组编辑页面
- 添加一条入站规则:
- 类型:
MySQL/Aurora(端口3306) - 来源:选择EC2实例所在的安全组ID(优先推荐,避免EC2 IP变动导致失效),或直接填写EC2的私网IP/公网IP
- 类型:
- 注意:测试完成后不要保留
0.0.0.0/0的开放规则,避免安全风险
2. 验证EC2安全组出站规则
确保EC2允许向3306端口发起出站请求:
- 进入EC2控制台→选择目标实例→查看关联的安全组
- 检查出站规则是否包含:
- 类型:
MySQL/Aurora(端口3306) - 目标:可暂时设置为
0.0.0.0/0测试,后续改为RDS的私网IP或安全组ID
- 类型:
3. 测试EC2与RDS的网络连通性
在EC2上通过SSH执行以下命令,确认端口是否可达:
# 使用telnet测试 telnet silkweb-maria.chwegpctvkzc.us-east-2.rds.amazonaws.com 3306 # 或使用nc命令(若已安装) nc -zv silkweb-maria.chwegpctvkzc.us-east-2.rds.amazonaws.com 3306
- 若命令超时,回到安全组/VPC配置排查;若能建立连接,继续检查数据库权限
4. 检查数据库用户权限
本地能连接但EC2不能,可能是数据库用户的访问IP限制:
- 通过DBeaver登录RDS,执行SQL查看用户权限:
SELECT user, host FROM mysql.user WHERE user='xxxxx'; SHOW GRANTS FOR 'xxxxx'@'你的本地IP';
- 若用户的
host仅为你的本地IP,执行以下命令开放权限(测试用,生产环境需限制具体IP):
GRANT ALL PRIVILEGES ON *.* TO 'xxxxx'@'%' IDENTIFIED BY '你的数据库密码'; FLUSH PRIVILEGES;
5. 排查PHP代码与环境问题
- 确认
dbinfo.inc文件中的DB_USERNAME和DB_PASSWORD与DBeaver使用的一致(可通过页面输出的连接信息验证) - 检查EC2上的PHP是否安装了mysqli扩展:
php -m | grep mysqli
- 若未安装,根据系统版本安装:
- Amazon Linux:
sudo yum install php-mysqli - Ubuntu/Debian:
sudo apt install php-mysql
- Amazon Linux:
- 可在代码中添加连接超时设置,避免长时间等待:
$conn = mysqli_init(); mysqli_options($conn, MYSQLI_OPT_CONNECT_TIMEOUT, 10); // 设置10秒超时 $conn->real_connect($db_server, DB_USERNAME, DB_PASSWORD);
内容的提问来源于stack exchange,提问作者user761100
相关产品推荐
相关产品推荐

