1. 程式人生 > >網頁中實時檢視伺服器日誌(websocket + node.js實現)

網頁中實時檢視伺服器日誌(websocket + node.js實現)

每當我需要檢視linux伺服器的日誌時,我都需要通過SSH客戶端訪問,如果想讓其他人也能檢視日誌,首先需要安裝一個SSH客戶端,然後設定連線資訊,如果安全性高一點的,還需要額外在linux伺服器上配置【檢視日誌使用者】,表示許可權僅限於檢視日誌。每增加一個人想檢視日誌,都需要重複這個步驟,並且大大降低了密碼的私密性。

所以如果能通過網頁形式提供【實時檢視日誌】功能,就可以很好地避免了這些問題。

需求模型:把整個過程看成三個節點,瀏覽器-node.js伺服器-linux伺服器,它們之間的通訊過程如圖顯示:


瀏覽器端程式碼:

var host = '192.168.1.109';
var port = 8991;
var url = 'ws://' + host + ':' + port + '/';
var wsc = new WebSocket(url);

wsc.onopen = function () {
    console.log("Connection opened.");
};

wsc.onmessage = function (e) {
    console.log("Message received.");
};
wsc.onclose = function () {
    console.log("Connection closed.");
};


node.js端程式碼(require: einaros/ws + ssh2):

var WebSocketServer = require('ws').Server
    , wss = new WebSocketServer({ port: 8991 });
wss.on('connection', function connection(ws) {
    ws.on('message', function incoming(signal) {
        console.log('received: %s', signal);
        connectSsh(ws);
    });
    ws.on('close', function close() {
        console.log('disconnected')
    });
});
var Client = require('ssh2').Client;
function connectSsh(wsc) {
    var conn = new Client();
    conn.on('ready', function () {
        console.log('Client :: ready');
        conn.exec('tail /tmp/debug.log', function (err, stream) {
            if (err) throw err;
            stream.on('close', function (code, signal) {
                console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
                conn.end();
            }).on('data', function (data) {
                console.log('STDOUT: ' + data);
                wsc.send(data);
            }).stderr.on('data', function (data) {
                console.log('STDERR: ' + data);
            });
        });
    }).connect(
        { 
            host: '192.168.100.100', 
            port: 22, 
            username: 'frylock', 
            password: "pass"
            //privateKey: require('fs').readFileSync('/here/is/my/key') 
        });
    return conn;
}

類似這種開發、運維需求基本上可以用這種方式實現。