My 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远程访问数据库。我一辈子都无法弄清楚我做了什么导致了这种情况。如果我更改了数据库服务器上的任何配置,那不是故意的。
我可以做进一步故障排除的任何想法?
我暂时解决此问题所做的是将/etc/mysql/my.cnf 中的端口更改为 3307。不过,我真的很想知道如何在不更改端口的情况下解决此问题。
我将遵循@Brad的建议,致力于通过数字海洋的专用网络连接api服务器和数据库服务器。