You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Workbench可连接远程服务器本地MySQL,但Node.js无法连接

Node.js 用 ssh2 + mysql2 连接远程MySQL报 ECONNREFUSED 127.0.0.1:3306 的解决方法

你的核心问题是没配置SSH端口转发——虽然SSH连接成功了,但本地的3306端口并没有映射到远程服务器的MySQL端口上,代码里连127.0.0.1:3306其实是在连你自己本地的MySQL(如果没装就会被拒绝),而非远程服务器上的。MySQL Workbench能正常连接,是因为你在Workbench里已经配置了SSH隧道转发,自动把本地请求转到了远程的MySQL端口。

正确的实现代码

需要在SSH连接就绪后,手动创建端口转发隧道,再让mysql2通过这个隧道连接:

ssh.on('ready', () => {
  // 建立SSH端口转发:将本地3307端口的请求转发到远程服务器的127.0.0.1:3306
  ssh.forwardOut(
    '127.0.0.1',   // 本地绑定的地址
    3307,          // 本地用于转发的端口(选一个本地未被占用的端口即可)
    '127.0.0.1',   // 远程服务器上MySQL监听的地址
    3306,          // 远程服务器上MySQL的端口
    (err, stream) => {
      if (err) throw err;

      // 创建MySQL连接,指定使用SSH隧道的stream
      const db_connection = mysql.createConnection({
        host: '127.0.0.1',
        port: 3307,
        user: 'myDBuser',
        password: 'myDBusersPassword',
        stream: stream // 关键:让MySQL连接走SSH隧道
      });

      db_connection.connect((err) => {
        if (err) {
          console.error('MySQL连接失败:', err);
          return;
        }
        console.log('MySQL连接成功');
      });

      // 记得在结束时关闭连接和隧道
      db_connection.on('close', () => {
        stream.end();
        ssh.end();
      });
    }
  );
}).connect(sshConfig);

关键说明

  1. 端口转发的作用:forwardOut方法会把你本地3307端口的所有请求,通过已建立的SSH连接转发到远程服务器的127.0.0.1:3306(也就是远程的MySQL服务)。
  2. 本地端口选择:只要是本地未被占用的端口都可以用,不一定是3307,避免和本地已有的服务冲突。
  3. 远程MySQL地址:如果远程MySQL监听的不是127.0.0.1(比如绑定了服务器的公网IP或内网IP),需要把forwardOut里的第三个参数改成对应的地址。

额外注意事项

  • 检查本地转发端口是否被其他进程占用,可以用lsof -i :3307(Mac/Linux)或netstat -ano | findstr :3307(Windows)排查。
  • 确保远程服务器的MySQL服务确实在运行,并且监听了对应的端口。
  • 处理好连接错误和关闭逻辑,避免SSH或MySQL连接泄漏。

内容的提问来源于stack exchange,提问作者Slippy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 22:48:51