同一VPC同一子网下EC2应用实例与MySQL实例通信故障解决
解决同一VPC子网内EC2应用与MySQL实例的连接问题
我来帮你一步步排查这个连接失败的问题,按照下面的步骤逐一验证,大概率能搞定:
一、先查安全组配置(最常见的问题根源)
1. 数据库EC2的安全组必须开对入站规则
- 核心要允许**TCP协议、3306端口(如果改了MySQL默认端口就用你设置的那个)**的入站流量
- 来源别乱开公网,同一子网里直接用这俩方式更安全:
- 应用EC2的私有IP地址(精准控制)
- 应用EC2所在的安全组ID(灵活,就算应用实例换IP也不用改规则)
- 举个例子:入站规则里加一条「TCP | 3306 | 应用EC2的安全组ID」
2. 应用EC2的安全组出站规则确认
- 默认情况下安全组出站是允许所有流量的,如果你没改过这部分,基本没问题
- 但如果自定义了出站规则,一定要确保允许到数据库EC2的3306端口的TCP流量
二、检查MySQL本身的配置(第二常见的坑)
1. 修改绑定地址,允许外部连接
- 登录到数据库EC2,找到MySQL的配置文件(Ubuntu/Debian一般是
/etc/mysql/mysql.conf.d/mysqld.cnf,CentOS/RHEL可能是/etc/my.cnf) - 找到
bind-address这行,默认是127.0.0.1(只能本地连),改成:- 数据库EC2的私有IP(只允许本实例私有IP接收连接,最安全)
- 或者
0.0.0.0(允许所有IP连,方便但安全性稍差)
- 改完重启MySQL:
sudo systemctl restart mysql(Ubuntu)或者sudo systemctl restart mysqld(CentOS)
2. 给应用用户配置正确的连接权限
- 登录MySQL控制台:
mysql -u root -p - 检查应用用的数据库用户,比如你用的是
app_user,要给它授权从应用EC2的私有IP连接:GRANT ALL PRIVILEGES ON 你的数据库名.* TO 'app_user'@'应用EC2的私有IP' IDENTIFIED BY '你的密码'; -- 如果想允许整个子网的IP连接(比如子网CIDR是10.0.1.0/24),可以这么写: GRANT ALL PRIVILEGES ON 你的数据库名.* TO 'app_user'@'10.0.1.%' IDENTIFIED BY '你的密码'; - 别忘了执行
FLUSH PRIVILEGES;刷新权限,不然改动不生效
三、验证网络连通性,定位问题点
1. 在应用EC2上测试端口通不通
- 用telnet测试:
telnet 数据库EC2私有IP 3306,如果成功会显示Connected to xxx - 没有telnet的话用nc命令:
nc -zv 数据库EC2私有IP 3306,成功会提示Connection to xxx port 3306 [tcp/mysql] succeeded! - 如果这一步失败,回去再检查安全组和子网路由;如果成功,那问题肯定在MySQL的配置或者用户权限上
2. 确认子网路由表没问题
- 同一子网内的实例通信,VPC默认的路由表已经包含了本地路由(比如
10.0.0.0/16指向local) - 如果你自定义了路由表,一定要确保这条本地路由存在,不然实例之间没法通信
按上面的步骤逐一排查,基本就能解决连接问题了。
内容的提问来源于stack exchange,提问作者npn
相关产品推荐
相关产品推荐

