伸縮擴充套件Node.JS應用
伸縮擴充套件Node.js應用是一個具有挑戰性的任務,Javascript的單執行緒特性會阻止你的Node使用現代多核應用,比如下面一個基本Http伺服器,這個程式碼無論是在單核還是多核上都是執行在一個執行緒中。
var http = require("http"); var port = parseInt(process.argv[2]); http.createServer(function(request, response) { console.log("Request for: " + request.url); response.writeHead(200); response.end("hello world\n"); }).listen(port); <p class="indent"> |
跨多核擴充套件
只要稍微做些修改,這段程式碼就能充分利用多核特點,下面是使用cluster模組進行最佳化,Cluster允許你方便地建立一個分享埠的程式網路,在這個例子中,每個核對應單獨程式,是由numCPU定義,每個子程式然後實現Http伺服器,透過監聽分享的埠。
var cluster = require("cluster"); var http = require("http"); var numCPUs = require("os").cpus().length; var port = parseInt(process.argv[2]); if (cluster.isMaster) { for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on("exit", function(worker, code, signal) { cluster.fork(); }); } else { http.createServer(function(request, response) { console.log("Request for: " + request.url); response.writeHead(200); response.end("hello world\n"); }).listen(port); } <p class="indent"> |
跨多臺機器擴充套件
上面實現了一個機器內跨多核的擴充套件,下面看看如何跨伺服器橫向擴充套件。
擴充套件多個伺服器是透過使用一個反向代理伺服器,對進來的請求實現負載平衡。
Nodejitsu 已經開發了node-http-proxy,這是一個NodeJS的開源代理伺服器,這個模組透過如下命令安裝:
npm install http-proxy <p class="indent"> |
下面是使用案例程式碼,在這個例子中哦哦那個,負載是在本地伺服器兩個埠之間進行平衡,在測試反向代理之前,確保原來的Http伺服器執行在埠8080和8081之間,下一步,載入反向代理,然後就可以用瀏覽器連線它,如果正常,你會看到請求在兩臺伺服器之間分發。
var proxyServer = require('http-proxy'); var port = parseInt(process.argv[2]); var servers = [ { host: "localhost", port: 8081 }, { host: "localhost", port: 8080 } ]; proxyServer.createServer(function (req, res, proxy) { var target = servers.shift(); proxy.proxyRequest(req, res, target); servers.push(target); }).listen(port); <p class="indent"> |
當然,這個案例只是使用了一臺伺服器,如果你有多臺伺服器,讓你的反向代理伺服器執行在一臺伺服器上,而使用另外一臺或幾臺執行Http伺服器。
使用Nginx擴充套件
使用反向代理當然好,因為它讓你的整個軟體堆疊都是相同的技術。然而,在生產系統中,更普遍的是使用nginx作為處理負載平衡。 nginx的是一個開放原始碼的HTTP和反向代理伺服器是,它服務於靜態檔案如CSS和HTML都非常好。因此,nginx可以用來快取和服務於您的網站的靜態內容,同時轉發動態內容到Node伺服器的請求。
下面是Nginx作為反向代理的配置:
user nobody; worker_processes 1; error_log logs/error.log; error_log logs/error.log notice; error_log logs/error.log info; pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; sendfile on; tcp_nopush on; keepalive_timeout 0; keepalive_timeout 65; gzip on; upstream node_app { server 127.0.0.1:8080; server 127.0.0.1:8081; } server { listen 80; server_name localhost; charset koi8-r; access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location /foo { proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; proxy_set_header Connection ""; proxy_http_version 1.1; proxy_pass http://node_app; } error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } <p class="indent"> |
其中配置了upstream 伺服器名稱為node_app,在兩個IP之間平衡:
upstream node_app { server 127.0.0.1:8080; server 127.0.0.1:8081; } <p class="indent"> |
然後定義一下路由,上面配置中/foo就是一個將請求分發到 node_app。具體配置可見有關Nginx反向代理配置。
相關文章
- 使用Slice擴充套件伸縮OpenJPA 應用套件
- [譯]擴充套件 Node.js 應用套件Node.js
- 非推倒重來式的讀/寫伸縮擴充套件套件
- GeoEvent Server橫向伸縮擴充套件(四)——配置GeoEvent Server啟用分散式事件排程中心...Server套件分散式事件
- VSCode擴充套件應用VSCode套件
- easyui應用(四)--- easyui擴充套件UI套件
- 並查集擴充套件應用並查集套件
- 12306火車票訂票系統的伸縮擴充套件套件
- 印度遊戲平臺Dream11如何伸縮擴充套件他們的遊戲中臺?遊戲套件
- PHP的LZF壓縮擴充套件工具PHP套件
- 壓縮/擴充套件qcow2磁碟套件
- UNDO SEGMENT的擴充套件和收縮套件
- chrome擴充套件應用開發快速科普Chrome套件
- iOS Extension擴充套件開啟宿主應用iOS套件
- ?用Chrome擴充套件管理器, 管理你的擴充套件Chrome套件
- Node.js的可伸縮性Node.js
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- Windows 7 下用C++為node.js寫擴充套件模組WindowsC++Node.js套件
- plain framework的實際應用和擴充套件AIFramework套件
- c# 高階應用 理解擴充套件方法C#套件
- 前端打包成桌面應用、以及chrome擴充套件前端Chrome套件
- Ruby Ruport實踐—Ruport::Formatter應用擴充套件ORM套件
- 構建可擴充套件的應用(一) (轉)套件
- 如何在AWS上自動擴充套件Web應用套件Web
- PHP的bz2壓縮擴充套件工具PHP套件
- 使用C++為node.js寫擴充套件模組C++Node.js套件
- Node.js中Qt擴充套件模組Node-QtNode.jsQT套件
- 2.3.2.4 擴充套件 Data-Linked 應用程式物件套件物件
- 6個強大的AngularJS擴充套件應用AngularJS套件
- .Net開發筆記(十七) 應用程式擴充套件筆記套件
- 15 個 Angular.js 應用擴充套件指令解析AngularJS套件
- 利用”視窗小部件“擴充套件 Lotus Symphony 應用套件
- SQL_Postgresql-一些擴充套件和應用SQL套件
- WCF擴充套件:行為擴充套件Behavior Extension套件
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- Node.js垂直水平擴充套件與訊息整合方案Node.js套件
- 凱捷:擴充套件製造業AI應用報告套件AI
- Flutter 應用程式建立一個擴充套件皮膚列表Flutter套件