【问题标题】:Node ssh to mysql - Error: listen EADDRINUSE 127.0.0.1:3306节点 ssh 到 mysql - 错误:监听 EADDRINUSE 127.0.0.1:3306
【发布时间】:2018-07-04 02:52:49
【问题描述】:

我的 API 从不同服务器上的 mysql 数据库中提取数据(两者都由 Digital Ocean 托管)。我使用 npm 包 tunnel-ssh 和 mysql 来访问数据库。它一直运行良好,但现在(似乎出乎意料)我收到了这个错误:

Error: listen EADDRINUSE 127.0.0.1:3306
    at Object.exports._errnoException (util.js:1020:11)
    at exports._exceptionWithHostPort (util.js:1043:20)
    at Server._listen2 (net.js:1262:14)
    at listen (net.js:1298:10)
    at net.js:1408:9
    at _combinedTickCallback (internal/process/next_tick.js:83:11)
    at process._tickDomainCallback (internal/process/next_tick.js:128:9)
    at Function.Module.runMain (module.js:606:11)
    at Object.<anonymous> (/home/project/project-server/node_modules/babel-cli/lib/_babel-node.js:154:22)
    at Module._compile (module.js:570:32)
  code: 'EADDRINUSE',
  errno: 'EADDRINUSE',
  syscall: 'listen',
  address: '127.0.0.1',
  port: 3306 

代码如下:

let sshConf = {
  username: username,
  password: password,
  host: hostIP,
  port: 22,
  dstHost: sqlConf.host,
  dstPort: sqlConf.port
};

let server = tunnel(sshConf, function(error){
  if(error){
    console.log(error);
  }
  /* would establish connection to database here */
});

server.on('error', function(err){
  console.error('Something bad happened:', err); // error is caught here
});

我在数据库服务器上寻找一个可能正在使用该地址的进程。我试过杀死进程,但似乎没有什么不同。

$ lsof -i:3306
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld  1962 mysql   41u  IPv4  21608      0t0  TCP *:mysql (LISTEN)
mysqld  1962 mysql   49u  IPv4  22456      0t0  TCP localhost:mysql->localhost:56380 (ESTABLISHED)
mysqld  1962 mysql   50u  IPv4  22458      0t0  TCP localhost:mysql->localhost:56382 (ESTABLISHED)
sshd    2068  root    8u  IPv4  22455      0t0  TCP localhost:56380->localhost:mysql (ESTABLISHED)
sshd    2068  root    9u  IPv4  22457      0t0  TCP localhost:56382->localhost:mysql (ESTABLISHED)

我也尝试过重启数据库服务器。我仍然可以使用 MySQLWorkbench 远程访问数据库。我终其一生都无法弄清楚我做了什么导致这一切。如果我更改了数据库服务器上的任何配置,那不是故意的。

我可以做进一步的故障排除吗?

【问题讨论】:

  • MySQL,PID 1962,是在 3306 上监听的内容。(lsof 在这里“有帮助”,将 :3306 替换为 mysql。)使用普通的 SSH 隧道会更好通过 Digital Ocean 的私有网络(如果两个实例位于同一区域)而不是在应用层中实现。
  • @Brad 我读过将您的 API 和数据库放在不同的服务器上更安全,而 tunnel-ssh 是我访问数据库中数据的“解决方案”。我想我还有更多的研究要做!我尝试停止 mysqld (sudo mysqld stop) 以查看这将如何影响错误,但它再次重新启动。在使我的 api 再次起作用方面,我不确定如何继续前进。如果我关闭 mysqld,那么我就没有数据库服务器。我希望我知道是什么导致了这种情况。我在我的项目中尝试了几个较早的提交,但这并没有解决问题。我也尝试克隆到不同的服务器。
  • 对于它的价值,您可以通过直接使用 ssh2 模块和 mysql2 模块来避免在本地完全收听,因为后者允许您提供任何双工流以用作底层套接字连接。当您通过 ssh 连接建立传出 TCP 连接时,ssh2 可以为您提供这样的流。

标签: mysql node.js ssh


【解决方案1】:

我临时解决此问题的方法是将 /etc/mysql/my.cnf 中的端口更改为 3307。我真的很想知道如何在不更改端口的情况下解决此问题。

我将按照@Brad 的建议,通过 Digital Ocean 的专用网络连接 api 服务器和数据库服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 1970-01-01
    • 2014-01-17
    • 2016-07-12
    • 2014-12-11
    • 2021-09-14
    相关资源
    最近更新 更多