2013-10-14 43 views
5

Tôi đang chạy một ứng dụng web trên máy chủ Node.js và tôi cần nó trực tuyến mọi lúc, vì vậy tôi đang sử dụng mãi mãi. Nhưng đây là những gì tôi nhận được sau một khoảng thời gian:Node.js - máy chủ đã đóng kết nối?

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 

Tôi có thêm hai máy chủ chạy trong khoảng 10 ngày liền. Tôi có một vòng lặp "keepalive" trên tất cả các máy chủ, làm cho một "chọn 1" mysql truy vấn mỗi 5 phút hoặc lâu hơn, nhưng có vẻ như nó không làm cho bất kỳ sự khác biệt.

Bất kỳ ý tưởng nào?

EDIT 1

các máy chủ khác của tôi đã đưa ra một lỗi tương tự, tôi nghĩ đó là "kết nối timeout", vì vậy tôi đặt chức năng này:

function keepalive() { 
    db.query('select 1', [], function(err, result) { 
     if(err) return console.log(err);  
     console.log('Successful keepalive.'); 
    }); 
} 

Và nó cố định hai máy chủ khác của tôi . Nhưng trên máy chủ chính của tôi, tôi vẫn nhận được lỗi ở trên.

Sau đây là cách tôi bắt đầu máy chủ chính của tôi:

var https = require('https'); 
https.createServer(options, onRequest).listen(8000, 'mydomain.com'); 

Tôi không chắc chắn những gì đang khiến bạn quan tâm nhìn thấy. Về cơ bản, máy chủ là một API REST và nó cần phải luôn cập nhật. Nó nhận được khoảng 2-5, có thể 10 yêu cầu mỗi phút.

+0

Dường như tập lệnh ứng dụng của bạn có một số lỗi .. Thử chạy 'node app.js' thay vì mãi mãi để xem lỗi. – Sriharsha

+0

Không có lỗi hiển thị trong nhật ký, tôi đã thử chạy nó với nút-dev. Đây là thông báo lỗi duy nhất tôi thấy. –

+0

Hãy cho chúng tôi biết thêm về ứng dụng của bạn để chúng tôi có thể hiểu những gì đang diễn ra. Bạn để lại một ổ cắm mở với mysql? Tại sao? Nó là một cơ sở dữ liệu từ xa? – TheBronx

Trả lời

13

Lỗi này không liên quan đến trường hợp HTTPS của bạn, nó liên quan đến kết nối MySQL của bạn.

Kết nối với cơ sở dữ liệu kết thúc bất ngờ và không được xử lý. Để khắc phục điều này, bạn có thể sử dụng giải pháp kết nối lại thủ công hoặc bạn có thể sử dụng tính năng nhóm kết nối tự động xử lý kết nối lại.

Đây là ví dụ về kết nối thủ công được lấy từ tài liệu của 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(); 
+0

Xin lỗi vì trả lời muộn. Tôi chỉ thay thế mã của tôi với câu trả lời của bạn và tôi bắt đầu máy chủ. Chúng ta nên biết vào ngày mai nếu nó hoạt động :) Chúc mừng –

+0

Nó có hoạt động không? Ngoài ra, @hexacyanide, bất kỳ suy nghĩ về lý do tại sao điều này thậm chí sẽ cần thiết? tại sao kết nối MySql liên tục bị mất một cách không thường xuyên? –

+2

Tôi vừa mới gặp lỗi này lần đầu tiên. Sau nhiều tháng thời gian hoạt động, kết nối MySQL đột nhiên không khả dụng. Nó bật ra tôi đã có một gói được gọi là 'không giám sát-nâng cấp' được cài đặt, và nó sắp xếp cho một bản cập nhật bảo mật MySQL được áp dụng tự động, dẫn đến một máy chủ MySQL khởi động lại. –

Các vấn đề liên quan