通过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);
关键说明
- 端口转发的作用:
forwardOut方法会把你本地3307端口的所有请求,通过已建立的SSH连接转发到远程服务器的127.0.0.1:3306(也就是远程的MySQL服务)。 - 本地端口选择:只要是本地未被占用的端口都可以用,不一定是3307,避免和本地已有的服务冲突。
- 远程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
相关产品推荐
相关产品推荐

