導航:首頁 > IDC知識 > nodejs是伺服器

nodejs是伺服器

發布時間:2021-01-01 06:50:25

1、nodejs 如何部署到伺服器上?

兩點:第一是否是線上服務,第二是否需要守護進程;
第一點,如果是線上服務,毫無疑問需要一個守護進程來保證,發生意外導致進程退出後,能重新啟動,提供服務;當然就需要pm2等守護進程來啟動,使用方法請自行參照github;第二點,是否需要守護進程,如果不需要,那麼直接node啟動即可;如果需要,也不必擔心pm2啟動進程後並不會搶占伺服器資源,如果你的server有很大的需求,毋庸置疑需要更多的內存和cpu,如果沒有很大需求,pm2會基於linux的資源調度策略,並不會搶占;

2、如何搭建簡單的nodejs伺服器

//請求模復塊 
var libHttp = require("http"); //HTTP協議模塊 
var url = require("url")
//Web伺服器制主函數,解析請求,返回Web內容 
var funWebSvr = function (req, res){ 
var result = "Hello nodejs";
res.writeHead(200, {"Content-Type": "text/html"}); 
res.write(result); 
res.end(); 

//創建一個http伺服器 
var webSvr=libHttp.createServer(funWebSvr); 
//開始偵聽8888埠 
webSvr.listen(8888);

3、如何配置nodejs伺服器環境

小鳥雲伺服器niaoyun實例創建好之後,您可以使用以下任意一種方式登錄伺服器:

遠程桌面連接版(,MSTSC):採用這種權方式登錄,請確保實例能訪問公網。如果在創建實例時沒有購買帶寬,則不能使用遠程桌面連接。

管理終端VNC:無論您在創建實例時是否購買了帶寬,只要您本地有網頁瀏覽器,都可以通過管理控制台的管理終端登錄實例。

使用遠程桌面連接(MSTSC)登錄實例

打開開始菜單>遠程桌面連接,或在開始菜單>搜索中輸入mstsc。也可以使用快捷鍵Win+R來啟動運行窗口,輸入mstsc後回車啟動遠程桌面連接。

在遠程桌面連接對話框中,輸入實例的公網IP地址。單擊顯示選項。

輸入用戶名,如小鳥雲默認為niaoyun。單擊允許我保存憑據,然後單擊連接。這樣以後登錄就不需要手動輸入密碼了。

4、如何在伺服器上搭建nodejs

先確認下系統環境合不合要求

Python -V(確認python版本大於2.6)

訪問http://nodejs.org/download/下載需要的Node.js版本(wget
http://nodejs.org/dist/v0.10.26/node-v0.10.29.tar.gz )

解壓 tar zxvf node-v0.10.26-linux-x64.tar.gz

進入目錄 cd node-v0.10.26-linux-x64

./configure --prefix=/home/work/setups/node-v0.10.26

make

sudo make install

添加到系統環境 echo "export PATH=$PATH:/home/work/setups/node-v0.10.26/bin">>
~/.bash_profile

. ~/.bash_profile執行該文件更新$PATH變數
###安裝Express
sudo npm install express
-gd g參數:把express安裝到NodeJS的lib目錄d參數:同時安裝依賴模塊包

sudo npm install forever -gd

(異常情況:

如果遇到npm 找不到的情況 確認sudo node -v是否找不到 找不到的話:需要added /usr/local/bin to secure_path in /etc/sudoers :

sudo visudo

把 Defaults secure_path =
/sbin:/bin:/usr/sbin:/usr/bin 這行 改為 Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin然後:x保存退出

如果遇到

npm ERR! Error: Hostname/IP doesn't match certificate's altnames

執行 npm config set strict-ssl false

如果遇到 npm ERR! registry error parsing json

npm cache clean

執行 npm config set registry http://registry.npmjs.eu/

)
###部署forever
$ npm install -g forever

啟動

NODE_ENV=pro LANG='zh' /usr/local/bin/foreverstart-o
/home/work/log/node_out.log-e /home/work/log/node_err.log /home/work/webroot/index.js

NODE_ENV=pro 環境變數 pro為生產環境(程序中可以指定)

LANG 環境變數 指定默認語言

node_out.log 輸出日誌 注意路徑別抄成我的了

node_err.log 錯誤日誌

index.js 啟動文件

5、怎麼連接nodejs伺服器

前面已經學習了WebSocket API,包括事件、方法和屬性。詳情:WebSocket(二)--API  WebSocket是基於事件驅動,支持全雙工通信。下面通過三個簡單例子體驗一下。

簡單開始

1.安裝node。/  

2.安裝ws模塊

ws:是nodejs的一個WebSocket庫,可以用來創建服務。

3.server.js

在項目裡面新建一個server.js,創建服務,指定8181埠,將收到的消息log出來。

var WebSocketServer = require('ws').Server,
wss = new WebSocketServer({ port: 8181 });
wss.on('connection', function (ws) {
console.log('client connected');
ws.on('message', function (message) {
console.log(message);
});
});

4.建立一個client.html。

在頁面上建立一個WebSocket的連接。用send方法發送消息。

var ws = new WebSocket("ws://localhost:8181");
ws.onopen = function (e) {
console.log('Connection to server opened');
}  function sendMessage() {
ws.send($('#message').val());
}

頁面:

 View Code

運行之後如下,服務端即時獲得客戶端的消息。

模擬股票

上面的例子很簡單,只是為了演示如何運用nodejs的ws創建一個WebSocket伺服器。且可以接受客戶端的消息。那麼下面這個例子演示股票的實時更新。客服端只需要連接一次,伺服器端會不斷地發送新數據,客戶端收數據後更新UI.頁面如下,有五隻股票,開始和停止按鈕測試連接和關閉。

服務端:

1.模擬五隻股票的漲跌。

var stocks = {  "AAPL": 95.0,  "MSFT": 50.0,  "AMZN": 300.0,  "GOOG": 550.0,  "YHOO": 35.0}function randomInterval(min, max) {  return Math.floor(Math.random() * (max - min + 1) + min);
}var stockUpdater;var randomStockUpdater = function() {  for (var symbol in stocks) {  if(stocks.hasOwnProperty(symbol)) {  var randomizedChange = randomInterval(-150, 150);  var floatChange = randomizedChange / 100;
stocks[symbol] += floatChange;
}
}  var randomMSTime = randomInterval(500, 2500);
stockUpdater = setTimeout(function() {
randomStockUpdater();
}, randomMSTime);
}
randomStockUpdater();

2.連接建立之後就開始更新數據

wss.on('connection', function (ws) {  var sendStockUpdates = function (ws) {  if (ws.readyState == 1) {  var stocksObj = {};  for (var i = 0; i < clientStocks.length; i++) {  var symbol = clientStocks[i];
stocksObj[symbol] = stocks[symbol];
}  if (stocksObj.length !== 0) {  ws.send(JSON.stringify(stocksObj));//需要將對象轉成字元串。WebSocket只支持文本和二進制數據
console.log("更新", JSON.stringify(stocksObj));
}

}
}  var clientStockUpdater = setInterval(function () {
sendStockUpdates(ws);
}, 1000);
ws.on('message', function (message) {  var stockRequest = JSON.parse(message);//根據請求過來的數據來更新。
console.log("收到消息", stockRequest);
clientStocks = stockRequest['stocks'];
sendStockUpdates(ws);
});

客戶端:

建立連接:

var ws = new WebSocket("ws://localhost:8181");

onopen直接只有在連接成功後才會觸發,在這個時候將客戶端需要請求的股票發送給服務端。

var isClose = false;  var stocks = {  "AAPL": 0, "MSFT": 0, "AMZN": 0, "GOOG": 0, "YHOO": 0
};  function updataUI() {
ws.onopen = function (e) {
console.log('Connection to server opened');
isClose = false;  ws.send(JSON.stringify(stock_request));
console.log("sened a mesg");
}  //更新UI
var changeStockEntry = function (symbol, originalValue, newValue) {  var valElem = $('#' + symbol + ' span');
valElem.html(newValue.toFixed(2));  if (newValue < originalValue) {
valElem.addClass('label-danger');
valElem.removeClass('label-success');
} else if (newValue > originalValue) {
valElem.addClass('label-success');
valElem.removeClass('label-danger');
}
}  // 處理受到的消息
ws.onmessage = function (e) {  var stocksData = JSON.parse(e.data);
console.log(stocksData);  for (var symbol in stocksData) {  if (stocksData.hasOwnProperty(symbol)) {
changeStockEntry(symbol, stocks[symbol], stocksData[symbol]);
stocks[symbol] = stocksData[symbol];
}
}
};
}

updataUI();

運行效果如下:只需要請求一次,數據就會不斷的更新,效果是不是很贊,不用輪詢,也不用長連接那麼麻煩了。文章末尾會附上所有源碼。

(美股的漲跌和A股的顏色是反的,即紅跌綠漲)

實時聊天

上面的例子是連接建立之後,服務端不斷給客戶端發送數據。接下來例子是一個簡單的聊天室類的例子。可以建立多個連接。

1.安裝node-uuid模塊,用來給每個連接一個唯一號。

2.服務端消息發送

消息類型分notification和message兩種,前者是提示信息,後者是聊天內容。消息還包含一個id、昵稱和消息內容。在上一節有學習到readyState有四個值,OPEN表示連接建立可以發送消息。如果頁面關閉了,為WebSocket.CLOSE。

function wsSend(type, client_uuid, nickname, message) {  for (var i = 0; i < clients.length; i++) {  var clientSocket = clients[i].ws;  if (clientSocket.readyState === WebSocket.OPEN) {
clientSocket.send(JSON.stringify({  "type": type,  "id": client_uuid,  "nickname": nickname,  "message": message
}));
}
}
}

3.服務端處理連接

每新增加一個連接,都會發送一條匿名用戶的加入的提示消息,如果消息中帶有「/nick」 認為這一個修改昵稱的消息。然後更新客戶端的昵稱。其他都會當做聊天消息處理。

wss.on('connection', function(ws) {  var client_uuid = uuid.v4();  var nickname = "AnonymousUser" + clientIndex;
clientIndex += 1;
clients.push({ "id": client_uuid, "ws": ws, "nickname": nickname });
console.log('client [%s] connected', client_uuid);  var connect_message = nickname + " has connected";  wsSend("notification", client_uuid, nickname, connect_message);
console.log('client [%s] connected', client_uuid);
ws.on('message', function(message) {  if (message.indexOf('/nick') === 0) {  var nickname_array = message.split(' ');  if (nickname_array.length >= 2) {  var old_nickname = nickname;
nickname = nickname_array[1];  var nickname_message = "Client " + old_nickname + " changed to " + nickname;  wsSend("nick_update", client_uuid, nickname, nickname_message);
}
} else {
wsSend("message", client_uuid, nickname, message);
}
});

處理連接關閉:

var closeSocket = function(customMessage) {  for (var i = 0; i < clients.length; i++) {  if (clients[i].id == client_uuid) {  var disconnect_message;  if (customMessage) {
disconnect_message = customMessage;
} else {
disconnect_message = nickname + " has disconnected";
}  wsSend("notification", client_uuid, nickname, disconnect_message);
clients.splice(i, 1);
}
}
};
ws.on('close', function () {
closeSocket();
});

4.客戶端

沒有啟動時,頁面如下,change按鈕用來修改昵稱。

View Code

js:

//建立連接
 var ws = new WebSocket("ws://localhost:8181");  var nickname = "";
 ws.onopen = function (e) {
 console.log('Connection to server opened');
 }  //顯示
 function appendLog(type, nickname, message) {  if (typeof message == "undefined") return;  var messages = document.getElementById('messages');  var messageElem = document.createElement("li");  var preface_label;  if (type === 'notification') {
 preface_label = "<span class="label label-info">*</span>";
 } else if (type == 'nick_update') {
 preface_label = "<span class="label label-warning">*</span>";
 } else {
 preface_label = "<span class="label label-success">"
 + nickname + "</span>";
 }  var message_text = "<h2>" + preface_label + "&nbsp;&nbsp;"
 + message + "</h2>";
 messageElem.innerHTML = message_text;
 messages.appendChild(messageElem);
 }  //收到消息處理
 ws.onmessage = function (e) {  var data = JSON.parse(e.data);
 nickname = data.nickname;
 appendLog(data.type, data.nickname, data.message);
 console.log("ID: [%s] = %s", data.id, data.message);
 }
 ws.onclose = function (e) {
 appendLog("Connection closed");
 console.log("Connection closed");
 }  //發送消息
 function sendMessage() {  var messageField = document.getElementById('message');  if (ws.readyState === WebSocket.OPEN) {
 ws.send(messageField.value);
 }
 messageField.value = '';
 messageField.focus();
 }  //修改名稱
 function changName() {  var name = $("#name").val();  if (ws.readyState === WebSocket.OPEN) {
 ws.send("/nick " + name);
 }
 }

運行結果:

頁面關閉之後,連接馬上斷開。

這種實時響應的體驗簡直不能太爽,代碼也清爽了,前端體驗也更好,客戶端不用一直發請求,服務端不用等著被輪詢。

小結:上面例子的代碼都很好理解,接下來學習WebSocket協議。

6、如何用命令行開啟nodejs搭建web伺服器?

首先,需要安裝nodejs,這個可以去官網下載,目前我本地安裝的v0.12版本。

安裝完成後可以通過命令行測試安裝是否成功,輸入:node -v,應該會顯示當前安裝node版本號。


本文中用到的模塊,都是nodejs核心模塊,不需要從外部下載,如果有需要,可以使用以下命令安裝:npm install xxx。


開始
下一步,新建js文件,可以命名為server.js,代碼如下:
var http = require('http');
var url = require('url');
var path = require('path');
var fs = require('fs');
var dir, arg = process.argv[2] || ''; // 命令行第三個參數,用來接收目錄,可為空,相對當前server.js文件的目錄名稱


// 比如使用命令 node server debug,意思就是debug文件夾與server.js文件同級
// 且你想以debug文件夾啟動web服務



http.createServer(function (req, res) {
var pathname = __dirname + url.parse(req.url).pathname;

7、用nodejs搭建伺服器有什麼壞處

一般只問好處,沒聽說過要找壞處的。
使用Node.js搭建Web伺服器是學習Node.js比較全面的入門學習了。
因為實現Web伺服器需要用到幾個比較重要的模塊:http模塊、文件系統、url解析模塊、路徑解析模塊、以及301重定向技術等。

8、nodejs寫伺服器怎麼樣

<

9、nodejs怎麼實現伺服器與伺服器

var http = require("http"); var url = require("url"); http.createServer(function (req, res) { var urlObj = url.parse(req.url, true); // 獲取中國 URL var urlToProxy = urlObj.query.url; if (!urlToProxy) { res.statusCode = 四00; res.end("URL 必須"); } else { console.log("處理中國請求:" + urlToProxy); var parsedUrl = url.parse(urlToProxy); var opt = { host : parsedUrl.hostname, port : parsedUrl.port || 吧0, path : (parsedUrl.pathname || "") + (parsedUrl.search || "") + (parsedUrl.hash || "") }; http.get(opt, function(pres) { // 請求中國 URL 內容 res.statusCode = pres.statusCode; var headers = pres.headers; for (var key in headers) { res.setHeader(key, headers[key]); } pres.on("data", function(chunk) { res.write(chunk); // 寫數據 }); pres.on("end", function() { res.end(); }); }); } }).listen(吧0吧吧, "一二漆.0.0.一"); console.log("中國伺服器已經 吧0吧吧 埠啟"); 整中國伺服器實現比較簡單首先通 http 模塊 createServer() 用創建 HTTP 伺服器再通 listen() 讓該 HTTP 伺服器特定埠監聽 createServer() 傳入參數 HTTP 請求響應實際每 HTTP 請求都應於 HTTP 伺服器 request 事

10、nodejs當web伺服器行不行

可以呀

使用Node.js搭建Web伺服器是學習Node.js比較全面的入門教程,因為實現Web伺服器需要用到幾個比較重要的模塊:http模塊、文件系統、url解析模塊、路徑解析模塊、以及301重定向技術等,下面我們就一起來學習如何搭建一個簡單的Web伺服器。

作為一個Web伺服器應具備以下幾個功能:

1、能顯示以.html/.htm結尾的Web頁面

2、能直接打開以.js/.css/.json/.text結尾的文件內容

3、顯示圖片資源

4、自動下載以.apk/.docx/.zip結尾的文件

5、形如http://xxx.com/a/b/ , 則查找b目錄下是否有index.html,如果有就顯示,如果沒有就列出該目錄下的所有文件及文件夾,並可以進一步訪問。

6、形如http://xxx.com/a/b,  則作301重定向到http://xxx.com/a/b/ , 這樣可以解決內部資源引用錯位的問題。

引入需要用到的幾個模塊:


//http協議模塊var http = require('http');//url解析模塊var url = require('url');//文件系統模塊var fs = require("fs");//路徑解析模塊var path = require("path");

創建服務並在指定的埠監聽:


//創建一個服務var httpServer = http.createServer(this.processRequest.bind(this)); //在指定的埠監聽服務httpServer.listen(port,function(){    console.log("[HttpServer][Start]","runing at http://"+ip+":"+port+"/");    console.timeEnd("[HttpServer][Start]");});

在創建服務的時候需要傳遞一個匿名函數processRequest 對請求進行處理,processRequest接收2個參數,分別是request和response, request對象中包含了請求的所有內容,response是用來設置響應頭以及對客戶端做出響應操作。 

processRequest:function(request,response){    var hasExt = true;    var requestUrl = request.url;    var pathName = url.parse(requestUrl).pathname;     //對請求的路徑進行解碼,防止中文亂碼    pathName = decodeURI(pathName);     //如果路徑中沒有擴展名    if(path.extname(pathName) === ''){        //如果不是以/結尾的,加/並作301重定向        if (pathName.charAt(pathName.length-1) != "/"){            pathName += "/";            var redirect = "http://"+request.headers.host + pathName;            response.writeHead(301, {                location:redirect            });            response.end();            return ;        }        //添加默認的訪問頁面,但這個頁面不一定存在,後面會處理        pathName += "index.html";        hasExt = false; //標記默認頁面是程序自動添加的    }     //獲取資源文件的相對路徑    var filePath = path.join("http/webroot",pathName);     //獲取對應文件的文檔類型    var contentType = this.getContentType(filePath);     //如果文件名存在    fs.exists(filePath,function(exists){        if(exists){            response.writeHead(200, {"content-type":contentType});            var stream = fs.createReadStream(filePath,{flags:"r",encoding:null});            stream.on("error", function() {                response.writeHead(500,{"content-type": "text/html"});                response.end("<h1>500 Server Error</h1>");            });            //返迴文件內容            stream.pipe(response);        }else { //文件名不存在的情況            if(hasExt){                //如果這個文件不是程序自動添加的,直接返回404                response.writeHead(404, {"content-type": "text/html"});                response.end("<h1>404 Not Found</h1>");            }else {                //如果文件是程序自動添加的且不存在,則表示用戶希望訪問的是該目錄下的文件列表                var html = "<head><meta charset='utf-8'></head>";                 try{                    //用戶訪問目錄                    var filedir = filePath.substring(0,filePath.lastIndexOf(''));                    //獲取用戶訪問路徑下的文件列表                    var files = fs.readdirSync(filedir);                    //將訪問路徑下的所以文件一一列舉出來,並添加超鏈接,以便用戶進一步訪問                    for(var i in files){                        var filename = files[i];                        html += "<div><ahref='"+filename+"'>"+filename+"</a></div>";                    }                }catch (e){                    html += "<h1>您訪問的目錄不存在</h1>"                }                response.writeHead(200, {"content-type": "text/html"});                response.end(html);            }        }    });}

請求處理函數中有幾個重點需要說一下:

對於路徑中有中文的,瀏覽器會自動進行編碼(英文不變,中文會變),因此在接收到地址後,需要對地址進行解碼,否則最後得到的路徑和真實路徑不相符,

當訪問路徑不是以具體的文件結尾,並且不是以/結尾,則需要通過重定向加上/,表示當前目錄,否則當前路徑下的靜態資源會找不到

如果訪問路徑是目錄,則列出該目錄下所有文件及文件夾,並可以點擊訪問,為了讓中文目錄能正常顯示,則還要在header中設置charset=utf-8

核心代碼就這么多,大概140行左右,完整的代碼已上傳到github:https://github.com/git-onepixel/Node,  

如果要運行demo,打開cmd切換到根目錄,運行node start 即可。

與nodejs是伺服器相關的知識