You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:38:07