在AWS EC2安装Drupal连接Acquia DB时遇SQLSTATE[HY000][2002]错误
解决AWS EC2上Drupal 8安装时SQLSTATE[HY000] [2002] Connection拒绝错误
嘿,我之前在AWS EC2部署Drupal时也碰到过完全一样的SQLSTATE[HY000] [2002] Connection refused错误,给你梳理几个最关键的排查方向,亲测能解决大部分这类问题:
1. 先确认EC2和数据库的网络连通性
这是最常见的踩坑点,AWS的安全组/防火墙限制很容易被忽略:
- 如果用的是AWS RDS数据库:检查EC2实例的安全组是否允许**出站(Outbound)访问RDS实例的3306端口(MySQL默认);同时RDS的安全组要允许入站(Inbound)**来自EC2安全组的3306端口请求。
- 如果是EC2本地安装的MySQL:
- 检查EC2上的防火墙(比如
ufw或iptables)是否放行3306端口,执行sudo ufw allow 3306(Ubuntu/Debian)临时开放测试。 - 查看MySQL绑定的地址:打开
my.cnf(路径通常是/etc/mysql/my.cnf或/etc/my.cnf),找到bind-address配置,如果是127.0.0.1则只能本地访问,改成0.0.0.0(允许所有IP)或EC2的私有IP才能让Drupal连接。
- 检查EC2上的防火墙(比如
- 用命令测试连通性:在EC2终端执行
nc -zv <数据库IP/端点> 3306,如果返回succeeded说明网络通,否则就是网络层面的问题。
2. 验证MySQL用户的访问权限
很多时候是用户权限限制导致的连接拒绝:
- 登录MySQL(数据库所在机器),执行
SELECT user, host FROM mysql.user;,查看你的Drupal数据库用户对应的host字段,是不是允许EC2的IP访问(比如你的EC2私有IP或者%,%表示允许所有IP,测试用,生产环境建议指定具体IP)。 - 如果权限不对,更新权限:
GRANT ALL PRIVILEGES ON 你的数据库名.* TO '你的用户名'@'允许的IP或%' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;
3. 检查MySQL服务状态和可用性
- 如果是EC2本地MySQL:执行
systemctl status mysql(Ubuntu/Debian)或service mysqld status(CentOS),确认服务是active (running)状态,如果没启动就执行sudo systemctl start mysql。 - 如果是RDS:登录AWS控制台查看RDS实例状态,确保是
available,没有处于维护、停止或创建中状态。
4. 再仔细核对Drupal的数据库配置
虽然你说已经核对过,但再检查一遍sites/default/settings.php(Drupal 8的配置文件是这个,不是config.inc哦)里的数据库数组:
$databases['default']['default'] = [ 'database' => '你的数据库名称', 'username' => '你的数据库用户名', 'password' => '你的数据库密码', 'host' => '数据库IP或RDS端点地址', 'port' => '3306', // 确认端口和MySQL配置一致 'driver' => 'mysql', 'prefix' => '', ];
注意:如果是本地MySQL,host填localhost或127.0.0.1;如果是远程RDS,要填完整的RDS端点地址(比如xxx.rds.amazonaws.com),不要写错。
5. 直接在EC2上测试数据库登录
在EC2终端执行mysql -u 你的用户名 -p -h 数据库IP/端点,输入密码后如果能成功登录,说明数据库本身没问题,问题出在Drupal配置;如果登录失败,那就是数据库的网络或权限问题,先解决这个。
如果按照以上步骤排查后还是不行,可以把nc命令的输出、MySQL权限查询结果贴出来,这样更容易定位具体问题。
内容的提问来源于stack exchange,提问作者Jen
相关产品推荐
相关产品推荐

