phpMyAdmin本身不支持SSH隧道,需在Web服务器上预先建立本地端口转发(如ssh -fN -L 127.0.0.1:8888:127.0.0.1:80 jump.example.com),再配置$cfg['Servers'][$i]['host']='127.0.0.1'及对应端口,并确保隧道持久化存活。
phpmyadmin 本身不支持 ssh 隧道,所谓“通过 ssh 隧道访问”,实际是让浏览器或 phpmyadmin 服务端走本地回环 + 已建立的 ssh 端口转发——你得先在运行 phpmyadmin 的机器上手动建好隧道,它才可能连得上。
ssh -L 命令必须显式绑定 127.0.0.1
很多人用 ssh -L 8888:localhost:80 jump.example.com,结果 phpMyAdmin 访问失败。问题出在 localhost 在不同系统里可能解析为 Unix socket 或 IPv4/IPv6 混合地址,导致隧道监听不稳或不可达。
- 正确写法是:
ssh -fN -L 127.0.0.1:8888:127.0.0.1:80 jump.example.com -
-fN让 SSH 后台运行且不分配终端,适合长期维持隧道 - 两端都写
127.0.0.1,强制走 IPv4 TCP,避免 socket 冲突或 DNS 解析歧义 - 别用
0.0.0.0:8888,除非你真需要局域网其他设备访问——这会暴露端口,且可能被 phpMyAdmin 的 host 头校验拒绝
phpMyAdmin 配置必须用 127.0.0.1,不能写 localhost
在 config.inc.php 中,哪怕你隧道映射的是本地 8888 端口,$cfg['Servers'][$i]['host'] 也绝不能设为 'localhost'。
-
'localhost'在 PHP 的 mysqli 扩展中会优先尝试 Unix socket 连接,直接绕过你的 SSH 隧道 - 必须写
'127.0.0.1',确保走 TCP 协议栈,才能命中你ssh -L绑定的端口 - 对应端口填你映射的本地端口,比如
$cfg['Servers'][$i]['port'] = '8888'; - 如果 phpMyAdmin 和目标 Web 服务在同一台机器(如 Bitnami 套件),这点尤其关键——否则你看到的永远是 Connection refused
隧道进程存活比配置更重要
phpMyAdmin 不会检测 SSH 隧道是否断开,它只管发请求。一旦隧道挂了,页面就卡在登录或报错 #2002 Cannot log in to the MySQL server,但错误信息完全没提“隧道没了”。
- 检查是否还活着:
ps aux | grep 'ssh.*-L.*8888',能看到命令行才算有效 - 重启服务器后隧道自动消失,必须用
autossh或 systemd user service 守护,例如:autossh -fN -L 127.0.0.1:8888:127.0.0.1:80 jump.example.com - 别依赖 PuTTY 等 GUI 工具前台保持连接——窗口关了、网络抖动、SSH 超时都会中断
- 浏览器 Network 面板里看登录请求的目标地址和端口,确认是不是真的打到了你设的 8888,而不是默认的 80 或 443
最常被忽略的其实是权限链:SSH 能连跳板机 → 跳板机能连目标 Web 服务 → 目标 Web 服务的防火墙放行了 127.0.0.1 的回环流量 → phpMyAdmin 的 auth_type 和用户密码匹配。少一环,现象都是“连不上”,但原因完全不同。
立即学习“PHP免费学习笔记(深入)”;



















