同一EC2实例部署WordPress与MySQL,如何配置MySQL绑定私有子网IP且保障WordPress正常访问
我明白你想要实现的效果:单台EC2实例挂双网卡(公网子网+私有子网),让WordPress对外提供服务,同时把MySQL绑定到私有子网IP来降低公网暴露风险,但现在绑定私网IP后WordPress连不上数据库对吧?下面这几个关键点你可以一步步排查调整:
1. 先修正WordPress的数据库连接配置
WordPress默认的wp-config.php里,数据库主机可能填的是localhost或者EC2的公网IP?如果MySQL已经绑定到私有子网IP,你得把wp-config.php里的DB_HOST改成这个私有子网网卡IP,而不是公网IP或者localhost(除非你做了本地映射)。比如:
define('DB_HOST', '10.0.1.xxx'); // 这里替换成你的私有子网IP
注意:之前用localhost能连接,是因为MySQL默认监听127.0.0.1,但现在你改成了私网IP,localhost指向的127.0.0.1就和MySQL的监听地址不匹配了,自然连不上。
2. 验证EC2内部能访问私网IP的MySQL端口
登录到EC2实例,先测试本地能不能连到私网IP的3306端口:
# 用telnet测试连通性 telnet 10.0.1.xxx 3306 # 或者直接用MySQL客户端测试 mysql -u wp_user -p -h 10.0.1.xxx
如果连不上,大概率是系统防火墙(比如iptables或firewalld)限制了私网IP的3306端口访问。你需要添加规则允许本地(或实例的私网IP段)访问3306:
- 用iptables的话:
iptables -A INPUT -s 10.0.0.0/16 -p tcp --dport 3306 -j ACCEPT # 保存规则 service iptables save
- 用firewalld的话:
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.0/16" port protocol="tcp" port="3306" accept' --permanent firewall-cmd --reload
3. 检查MySQL的用户权限设置
MySQL的用户权限可能只允许从localhost或者公网IP连接,你得确保WordPress的数据库用户允许从私网IP或者实例内部地址连接。登录MySQL后执行:
GRANT ALL PRIVILEGES ON wp_database.* TO 'wp_user'@'10.0.1.xxx' IDENTIFIED BY 'your_password'; FLUSH PRIVILEGES;
这里的10.0.1.xxx就是你的EC2实例私有子网IP,别用'%'(太不安全),最好限定到具体的私网IP或私网IP段。
4. 确认MySQL的bind-address配置生效
你已经修改了my.cnf(或my.ini)里的bind-address为私有子网IP,记得重启MySQL服务让配置生效:
# 不同系统重启命令略有差异 service mysqld restart # 或者 systemctl restart mysql
重启后可以用命令检查MySQL的监听地址:
netstat -tulpn | grep mysql
输出应该显示10.0.1.xxx:3306,而不是公网IP或0.0.0.0,这就说明绑定成功了。
5. 可选小技巧:用localhost映射私网IP
如果你不想修改wp-config.php的DB_HOST,也可以在EC2的/etc/hosts里加一行:
10.0.1.xxx localhost
这样WordPress用localhost连接时,系统会解析到私网IP,也能正常访问绑定在私网IP的MySQL,同时不用改动WP配置。
按这几步操作,应该就能解决你的问题——既让MySQL绑定私有子网IP减少公网暴露,又能让同一实例上的WordPress正常连接数据库。
备注:内容来源于stack exchange,提问作者manoman687

