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

如何通过Node.js访问Plesk服务器上的MySQL数据库

解决Node.js通过SSH隧道连接Plesk MySQL失败的问题

我帮你梳理下你遇到的核心问题:MySQL Workbench能通过「Standard TCP/IP over SSH」(无私钥,密码认证)连接数据库,但Node.js 8.11.1用两种SSH隧道方案都报错。下面针对你尝试的两个方案逐一排查并给出修复方案:

方案1:修复mysql-ssh的连接错误

你遇到的All configured authentication methods failed错误,核心原因是你给mysql-ssh传了私钥配置,但你的SSH连接实际是用密码认证的(Workbench没用到私钥)。mysql-ssh默认优先使用密钥认证,当服务器不接受密钥时,又没有提供密码选项,就会握手失败。

修正后的代码(用密码认证SSH)

const mysqlssh = require('mysql-ssh');

// 注意:不要传privateKey字段,改用password
mysqlssh.connect(
  {
    host: '你的SSH主机地址', // 和Workbench里的「SSH Hostname」一致
    user: '你的SSH用户名', // 和Workbench里的「SSH Username」一致
    password: '你的SSH密码' // Workbench里的「SSH Password」
  },
  {
    host: '127.0.0.1', // Plesk的MySQL默认绑定本地回环,不要填公网地址
    user: '你的MySQL用户名',
    password: '你的MySQL密码',
    database: '目标数据库名'
  }
)
.then(client => {
  // 测试查询
  client.query('SELECT 1 AS test', (err, results) => {
    if (err) throw err;
    console.log('查询结果:', results);
    mysqlssh.close(); // 关闭连接
  });
})
.catch(err => {
  console.error('连接失败:', err.message); // 捕获所有错误,避免崩溃
});

方案2:修复mysql2 + ssh2的连接错误

你遇到的UnhandledPromiseRejectionWarning和ECONNRESET错误,主要是两个问题:

  1. 没有正确处理Promise的错误(缺少.catch()或try/catch)
  2. SSH连接配置错误(默认尝试密钥认证,而非密码)

修正后的代码(带完整错误处理+密码认证)

const { Client: SSHClient } = require('ssh2');
const mysql = require('mysql2/promise');

// SSH配置(和Workbench的SSH参数一致)
const sshConfig = {
  host: '你的SSH主机地址',
  port: 22, // 若服务商改了SSH端口,替换成对应值
  username: '你的SSH用户名',
  password: '你的SSH密码' // 核心:用密码认证,不要私钥
};

// MySQL配置(和Workbench的MySQL参数一致)
const mysqlConfig = {
  host: '127.0.0.1', // Plesk MySQL本地地址
  user: '你的MySQL用户名',
  password: '你的MySQL密码',
  database: '目标数据库名'
};

const sshClient = new SSHClient();

// 监听SSH连接错误
sshClient.on('error', (err) => {
  console.error('SSH连接出错:', err.message);
  sshClient.end();
});

// SSH连接成功后创建隧道
sshClient.on('ready', async () => {
  console.log('SSH隧道已建立');
  try {
    // 转发本地请求到服务器的MySQL端口(默认3306)
    const stream = await new Promise((resolve, reject) => {
      sshClient.forwardOut(
        '127.0.0.1', // 本地绑定地址
        0, // 自动分配本地端口
        '127.0.0.1', // 服务器上MySQL的地址
        3306, // MySQL端口
        (err, stream) => {
          if (err) reject(err);
          else resolve(stream);
        }
      );
    });

    // 通过隧道连接MySQL
    const connection = await mysql.createConnection({
      ...mysqlConfig,
      stream // 用SSH隧道流代替TCP连接
    });

    // 测试查询
    const [rows] = await connection.execute('SELECT 1 AS test');
    console.log('MySQL查询成功:', rows);

    // 关闭连接
    await connection.end();
    sshClient.end();
  } catch (err) {
    console.error('操作出错:', err.message);
    sshClient.end();
  }
});

// 启动SSH连接
sshClient.connect(sshConfig);

通用注意事项(针对你的Node.js 8.11.1版本)

  1. 版本兼容:Node.js 8.x属于老版本,安装依赖时要指定兼容的版本号,避免新版依赖不兼容:
    npm install mysql-ssh@1.0.6 ssh2@0.8.9 mysql2@1.6.5
    
  2. Plesk权限确认:确保你的MySQL用户允许从localhost访问(Plesk创建的用户默认已配置),且SSH用户有足够权限创建隧道。
  3. 错误捕获:所有异步操作必须加错误捕获(.catch()或try/catch),否则Node.js 8.x会因为未处理的Promise拒绝而崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:30:27