javascript Node.js - 服务器关闭了连接?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19357539/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Node.js - server closed the connection?
提问by Nikolay Dyankov
I'm running a web app on a Node.js server and I need it to be online all the time, so I'm using forever. But here is what I'm getting after a period of time:
我在 Node.js 服务器上运行一个 Web 应用程序,我需要它一直在线,所以我一直在使用。但这是我在一段时间后得到的:
Error: Connection lost: The server closed the connection.
at Protocol.end (/home/me/private/app/node_modules/mysql/lib/protocol/Protocol.js:73:13)
at Socket.onend (stream.js:79:10)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:910:16
at process._tickCallback (node.js:415:13)
error: Forever detected script exited with code: 8
error: Forever restarting script for 3 time
I have two more servers that have been running for about 10 days straight. I have a "keepalive" loop on all servers, making a "select 1" mysql query every 5 minutes or so, but it seems like it doesn't make any difference.
我还有两台服务器已经连续运行了大约 10 天。我在所有服务器上都有一个“keepalive”循环,每 5 分钟左右进行一次“select 1”mysql 查询,但似乎没有任何区别。
Any ideas?
有任何想法吗?
EDIT 1
编辑 1
My other servers were giving a similar error, I think it was "connection timeout", so I put this function:
我的其他服务器也出现了类似的错误,我认为是“连接超时”,所以我放了这个功能:
function keepalive() {
db.query('select 1', [], function(err, result) {
if(err) return console.log(err);
console.log('Successful keepalive.');
});
}
And it fixed my other two servers. But on my main server I'm still getting the error above.
它修复了我的另外两台服务器。但是在我的主服务器上,我仍然收到上述错误。
Here is how I'm starting my main server:
这是我启动主服务器的方式:
var https = require('https');
https.createServer(options, onRequest).listen(8000, 'mydomain.com');
I'm not sure what code are you interested in seeing. Basically the server is a REST API and it needs to stay up all the time. It's getting about 2-5, maybe 10 requests per minute.
我不确定您有兴趣查看什么代码。基本上,服务器是一个 REST API,它需要一直保持运行。每分钟大约有 2-5 个请求,也许是 10 个请求。
回答by hexacyanide
The error isn't related to your HTTPS instance, it's related to your MySQL connection.
该错误与您的 HTTPS 实例无关,与您的 MySQL 连接有关。
The connection to the database is ending unexpectedly and isn't being handled. To fix this, you can use a manual reconnect solution, or you can use connection pooling which automatically handles reconnects.
与数据库的连接意外结束且未被处理。要解决此问题,您可以使用手动重新连接解决方案,也可以使用自动处理重新连接的连接池。
Here is the manual reconnect example taken from node-mysql's documentation.
这是取自node-mysql文档的手动重新连接示例。
var db_config = {
host: 'localhost',
user: 'root',
password: '',
database: 'example'
};
var connection;
function handleDisconnect() {
connection = mysql.createConnection(db_config); // Recreate the connection, since
// the old one cannot be reused.
connection.connect(function(err) { // The server is either down
if(err) { // or restarting (takes a while sometimes).
console.log('error when connecting to db:', err);
setTimeout(handleDisconnect, 2000); // We introduce a delay before attempting to reconnect,
} // to avoid a hot loop, and to allow our node script to
}); // process asynchronous requests in the meantime.
// If you're also serving http, display a 503 error.
connection.on('error', function(err) {
console.log('db error', err);
if(err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually
handleDisconnect(); // lost due to either server restart, or a
} else { // connnection idle timeout (the wait_timeout
throw err; // server variable configures this)
}
});
}
handleDisconnect();