HTTP隧道在Navicat中通过PHP脚本(如tunnel.php)实现TCP流量中转,需正确配置目标数据库内网IP、端口及可访问的HTTP隧道URL,且PHP环境须支持sockets和allow_url_fopen;备份路径为本地绝对路径,跨服备份应使用mysqldump+定时任务。
HTTP 隧道 在 Navicat 里不是走 HTTP 协议,而是靠 PHP 脚本(比如 tunnel.php 或 ntunnel_sqlite.php)在公网 Web 服务器上做 TCP 流量中转。它能绕过防火墙限制,但前提是脚本跑得起来、网络通、参数填对——否则连“Connection refused”都报不出来。
为什么直接填 localhost 就连不上?
很多人在 tunnel.php 里把数据库地址写成 localhost 或 127.0.0.1,结果 navicat 报错“script not found”或“connection refused”。这是因为:localhost 指的是 web 服务器本机,而你要连的是内网数据库(比如 192.168.1.100:3306),两者不在一台机器上。
-
tunnel.php必须硬编码目标数据库的内网 IP 和端口,不能写localhost - SQLite 场景下,
ntunnel_sqlite.php中的$db_path填的是相对路径(相对于该 PHP 文件所在目录),不是绝对路径 - MySQL 场景下,脚本不读取 Navicat 输入的用户名/密码,这些凭据由 Navicat 直连数据库时使用,脚本只负责转发 TCP 流量
Navicat 配置 HTTP 隧道时最常填错的三个字段
配置入口在连接设置 → 「SSH」标签页 → 切换到「HTTP 隧道」(不是 SSH 标签本身)。这里三个字段极易出错:
-
HTTP 隧道 URL:必须是完整可访问地址,带协议头,如https://example.com/tunnel.php;末尾不能加斜杠,也不能是http://localhost/tunnel.php -
目标主机:填内网数据库真实 IP(如192.168.1.100),不是 Web 服务器 IP,也不是127.0.0.1 -
目标端口:填数据库实际监听端口(MySQL 默认3306,SQLite 不走端口,但脚本会监听 HTTP 请求)
脚本上传后浏览器一访问就报错?先查这三件事
打开浏览器直接访问 HTTP 隧道 URL,应该返回空白页或纯文本 OK。如果看到 PHP 错误、404、下载弹窗,说明脚本根本没执行成功:
- PHP 版本必须 ≥ 5.6,且
allow_url_fopen = On,extension=sockets已启用(Linux 下常需手动在php.ini中开启) -
tunnel.php权限设为644,所在目录不能有.htaccess拒绝执行(比如/admin/目录) - Web 服务器(Apache/Nginx)要允许执行 PHP,且没禁用
fsockopen()—— 这是脚本连内网 DB 的关键函数
备份文件导出路径只能写本地绝对路径
Navicat 的「自动备份」任务里,“导出到 SQL 文件”的路径框,填的不是服务器路径,而是 Navicat 客户端所在机器的本地路径。这点非常容易忽略:
- Windows 示例:
C:\backups\mysql\_$(DATE).sql($(DATE)是唯一支持的变量,格式固定为YYYYMMDD_HHMMSS) - 路径含空格或中文会导致静默失败,日志只显示
Failed to export - 如果想存到远程服务器,得靠外挂脚本:比如备份完成后用
scp或rsync推送到 NAS,或用curl -F上传到 Web API
真正跨服可靠的备份,不该依赖 Navicat 自动任务,而应改用 mysqldump + 系统定时任务,HTTP 隧道 只适合临时调试或低频人工备份——因为它的稳定性取决于 PHP 脚本生命周期、超时设置、以及中间任意一环的网络抖动。











