OVH Proxmox服务器容器间MySQL连接超时(SQLSTATE[HY000] [2002])求助
看起来你已经搞定了容器本地互联的基础配置,但MySQL连接超时的问题大概率是几个常见配置细节出了错,咱们一步步来排查修复:
1. 先修正最明显的MySQL绑定地址错误
你提到在my.cnf里设置了bind-address=192.168.1.3,但你的MySQL容器IP是192.168.1.2啊!这是核心问题——MySQL只能绑定自身容器的IP或者0.0.0.0(允许监听所有网卡),绑定别的IP的话,服务根本不会在正确的接口上监听3306端口,自然连不上。
操作步骤:
- 进入MySQL容器:
pct enter <你的MySQL容器ID> - 找到
my.cnf(通常在/etc/mysql/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),修改bind-address为192.168.1.2或者0.0.0.0 - 重启MySQL服务:
systemctl restart mysql
2. 验证MySQL端口是否正常监听
在MySQL容器里执行这条命令,确认3306端口的监听状态:
netstat -tulpn | grep 3306
正常输出应该是0.0.0.0:3306或者192.168.1.2:3306,如果显示127.0.0.1:3306或者你之前写错的192.168.1.3:3306,说明配置还没改对。
3. 检查MySQL用户的连接权限
就算网络通了,如果PHP用的MySQL用户不允许从192.168.1.3(Apache容器IP)连接,也会报错。
进入MySQL命令行:
mysql -u root -p
执行以下命令查看用户权限:
SELECT user, host FROM mysql.user;
如果你的应用用户(比如appuser)的host列是localhost或127.0.0.1,需要修改权限:
-- 允许从Apache容器IP连接 GRANT ALL PRIVILEGES ON your_database.* TO 'appuser'@'192.168.1.3' IDENTIFIED BY 'your_password'; -- 刷新权限生效 FLUSH PRIVILEGES;
(生产环境别随便用%允许所有IP连接,尽量指定具体IP)
4. 跳过PHP直接测试容器间连接
在Apache容器里用mysql客户端直接连,排除代码层面的问题:
mysql -h 192.168.1.2 -u your_username -p
如果这个命令能成功连接,说明网络和MySQL配置没问题,去检查PHP代码的连接参数(比如是不是把主机写成了localhost);如果还是超时,继续往下查。
5. 排查防火墙规则
容器能ping通不代表3306端口的流量能过,检查这两处:
- MySQL容器内部:临时关闭防火墙测试,比如
systemctl stop ufw,再尝试连接 - Proxmox宿主机:用
iptables -L -n | grep 3306查看规则,如果没有允许3306的条目,添加一条(假设桥接网卡是vmbr0):
iptables -A INPUT -i vmbr0 -p tcp --dport 3306 -j ACCEPT
6. 最后确认PHP连接参数
检查你的PHP代码里的数据库配置,确保主机地址是192.168.1.2,比如:
$dsn = 'mysql:host=192.168.1.2;dbname=your_database;charset=utf8'; $pdo = new PDO($dsn, 'your_username', 'your_password');
按这个流程走下来,基本能解决连接超时的问题。
内容的提问来源于stack exchange,提问作者Diogo Jesus

