根本原因是SSH隧道配置与phpMyAdmin连接参数未对齐:每个远程MySQL实例需独立本地端口(如3307、3308)和显式127.0.0.1绑定,且phpMyAdmin中host必须设为'127.0.0.1'、port严格匹配隧道端口;同时远程MySQL须监听127.0.0.1并授权对应用户,防火墙需放行本地回环流量。
根本原因不是 phpmyadmin 本身不支持隧道,而是 ssh 隧道配置与 phpmyadmin 的服务器连接参数没对齐——每个远程 mysql 实例都需要独立、显式、可验证的隧道绑定,而多数人误把多服务器当成“统一通道”来配。
ssh -L 命令没为每个服务器单独绑定本地端口
phpMyAdmin 的 $cfg['Servers'][$i]['host'] 和 $cfg['Servers'][$i]['port'] 是按索引一对一映射的,但很多人只跑一条 ssh -L 3306:127.0.0.1:3306 user@server1,就以为所有服务器都能走这个端口。实际上:
- 不同远程服务器必须用不同本地端口(如
3307、3308),否则后启动的隧道会抢占前一个,导致部分连接直接失败 -
ssh -L默认绑定localhost,某些系统下localhost解析为 Unix socket,绕过 TCP;必须显式写成127.0.0.1:3307 - 隧道命令需保持前台运行或用
-fN后台化,断开后 phpMyAdmin 不会自动重连,页面仍显示 #2002 错误
phpMyAdmin 配置中 host 写成了 'localhost' 而非 '127.0.0.1'
PHP 的 mysqli 扩展对 localhost 有特殊处理:它会优先尝试 Unix socket 连接,完全跳过 TCP 层,导致 SSH 隧道被无视。这是多服务器场景下最隐蔽的坑。
- 所有通过隧道连接的服务器,
$cfg['Servers'][$i]['host']必须设为'127.0.0.1'(字符串,带单引号) -
$cfg['Servers'][$i]['port']必须严格匹配你ssh -L中指定的本地端口(如'3307') - 不要复用同一组 host/port 配置去“适配多个服务器”,每个
$i索引必须有唯一且对应的 tunnel + port
MySQL 服务端未允许 127.0.0.1 回环访问
SSH 隧道本质是把远程 MySQL 的 3306 端口“拉到”你本地的某个端口上,但前提是远程 MySQL 真的监听并接受来自 127.0.0.1 的连接。很多生产环境 MySQL 只绑定了内网 IP 或 0.0.0.0,却忘了确认回环通路。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
- 登录远程服务器,执行
mysql -h 127.0.0.1 -u root -p—— 若连不上,说明 MySQL 本身拒绝回环连接 - 检查
my.cnf中bind-address是否为127.0.0.1、0.0.0.0或具体内网 IP;若为127.0.0.1,则只能本机连,需改为0.0.0.0或补充监听地址 - 确认用户权限:远程 MySQL 用户必须授权给
'user'@'127.0.0.1'(不只是'user'@'%'),否则隧道流量会被认证拒绝
防火墙或安全组没放行远程 MySQL 的 3306 端口(仅限隧道链路)
这里容易混淆:SSH 隧道走的是 22 端口,但隧道内部转发的 MySQL 流量仍依赖远程服务器上的 3306 端口能被本机进程访问。如果远程服务器启用了 iptables/firewalld 且默认 DROP 所有 INPUT,那么即使 SSH 连得上,127.0.0.1:3306 也可能被拦截。
- 在远程服务器上执行
sudo ss -tlnp | grep :3306,确认 mysqld 确实在监听 - 检查防火墙是否允许
127.0.0.1到127.0.0.1:3306的本地回环流量:sudo iptables -L INPUT -v -n | grep 3306 - 云服务器还需确认安全组规则——不是只开 22 端口就够了,3306 端口必须对
127.0.0.1生效(有些安全组策略对回环地址无效,需额外放行)
真正麻烦的不是建隧道,而是每个服务器都要独立验证“本地端口→SSH进程→远程127.0.0.1:3306→MySQL用户权限→防火墙回环规则”这条链路上的每一环。少一个 '127.0.0.1'、多一个 localhost、漏一条 iptables 规则,都会让整个多服务器隧道失效,且错误表现高度相似——全是 #2002。