5個提高Node.js應用性能的技巧

“如果你的 node 服務器前面沒有 nginx, 那么你可能做錯了?!薄?nbsp;Bryan Hughes

Node.js 是使用 最流行的語言— JavaScript 構建服務器端應用的領先工具 。由于可以同時提供 web 服務器和應用服務器的功能,Node.js 被認為是以微服務為基礎的開發和部署的關鍵工具。

在后端開發中,Node.js 可以替換或者擴展 Java 和 .NET。

Node.js 是單線程非阻塞 I/O, 使其可以支持成千上萬的并發操作。這和 NGINX 解決 C10K 問題的方式如出一轍。Node.js 以高效的性能和開發效率著稱。

 所以,到底哪里做錯了?

 Node.js 的一些缺陷使得以 Node.js 為基礎的系統面臨潛在的性能問題甚至崩潰,這在系統流量迅速增長時表現的尤其明顯。雖然 Node.js 是處理 web 應用邏輯的很好工具,但它并不擅長處理靜態文件,比如圖片和 JavaScript 文件,同樣不擅長多個服務器間的負載均衡。

 為了更好的使用  Node.js, 你需要把緩存靜態文件、代理、負載均衡、客戶端連接管理等功能交給 NGINX 去做。

 下面是一些提高 Node.js 性能的建議

  1.  實現一個反向代理服務器

  2.  緩存靜態文件

  3.  多服務器負載均衡

  4.  代理 WebSocket 連接

  5.  實現 SSL/TLS 和 HTTP/2

注:提升 Node.js 應用性能的最快方法是修改你的 Node.js 文件來利用多核處理器,查看這篇文章來學習如何充分利用服務器上的多核CPU。

1.  實現一個反向代理服務器

相比大多數應用服務器,Node.js 可以很輕松的處理大量的網絡流量,但這并不是 Node.js 的設計初衷。

 如果你有一個高流量的站點,提高性能的第一步是在你的 Node.js 前面放一個反向代理服務器。這可以?;つ愕?Node.js 服務器免于直接暴露在網絡中,而且可以允許你靈活的使用多個應用服務器做負載均衡和靜態文件緩存。

 1

 

使用 NGINX 在一個已經存在的服務器前做反向代理,作為 NGINX 的一個核心應用,已經被用于全世界成千上萬的站點中。

 下面是使用 NGINX 作為反向代理服務器的優點:

  1.  簡化了權限處理和端口分配

  2.  更高效的處理靜態資源

  3.  更好的處理 Node.js 崩潰情況

  4.  緩解 DoS 攻擊的影響

注:這篇文章解釋如何在 Ubuntu 14.04 或者 CentOS 環境中使用 NGINX 做反向代理服務器,而且使用 NGINX 在 Node.js 前做反向代理服務器是有效的。

 2. 緩存靜態文件

隨著流量的增長,以 Node 為基礎的服務器開始顯現壓力。這時,你可能想做兩件事:

 1. 使用更多的 Node.js 服務器。

 2. 在多個服務器間做負載均衡

這其實很簡單,NGINX 一開始就是作為反向代理服務器來實現的,這使其很容易做緩存和負載均衡等。

Modulus 的網站有一篇有用的文章,介紹了使用 NGINX 做 Node.js 反向代理服務器的性能提升。只使用 Node.js 時,作者的網站每秒能處理 900 個請求。 使用 NGINX 作為反向代理服務器來處理靜態文件后,該網站每秒可處理超過 1600 個請求,接近兩倍的性能提升。

下面是該網站做上述性能提升的配置代碼:

nginx

1

2

3

4

5

6

7

8

9

10

11

12

server {

  listen 80;

  server_name static-test-47242.onmodulus.net;

  root /mnt/app;

  index index.html index.htm;

  location /static/ {

       try_files $uri $uri/ =404;

  }

  location /api/ {

       proxy_pass http://node-test-45750.onmodulus.net;

  }

}


3. 實現 Node.js 負載均衡

最終目標— Node.js 運行多個應用服務器,并在這些服務器之間均衡負載。

Node.js 實現負載均衡是比較困難的,因為 Node.js 允許瀏覽器端 JavaScript 和 服務器端 Node.js 通過 json 做數據交互,這就意味著同一個客戶端可以反復的訪問一個特定的應用服務器,而且多個應用服務器之間共享 session也是比較困難的。

 NGINX 實現無狀態負載均衡的方式:

  •  Round Robin. 新的請求去列表中的下一個服務器

  •  Least Connections. 新的請求去連接數最少的服務器

  •  IP Hash. 根據客戶端 IP 的 hash 值指定服務器

只有 IP Hash 這一種能夠可靠的把客戶端請求代理到同一臺服務器的方式才能使 Node.js 應用服務器受益。

4. 代理 WebSocket 連接

所有版本的 HTTP 都是為客戶端主動請求服務器來設計的,而 WebSocket 可以實現服務器主動向客戶端的消息推送。

WebSocket 協議使客戶端和服務器端的穩定交互更加簡單,同時也提供更小的交互延遲。當你需要一個全雙工的通訊,即客戶端和服務器都可以在需要時主動發起消息請求,那么使用 WebSocket 就對了。

WebSocket 協議有健全的 JavaScript 接口,因此也原生適合用 Node.js 作為應用服務器。當連接數上升,使用 NGINX 在客戶端和 Node.js 服務器端做代理來緩存靜態文件和負載均衡就變得非常有意義。

5. 實現 SSL/TLS 和 HTTP/2

越來越多的網站使用 SSL/TLS 來保證信息交互的安全性,你也可以考慮是否要把它加入到你的網站中,但如果你決定要做,那么 NGINX 有兩種方式來支持它:

 1. 你可以使用 NGINX 做 SSL/TLS 反向代理,Node.js 服務器使用解密后的請求然后返回未加密的內容給 NGINX。

 2. 使用 HTTP/2 可以抵消 SSL/TLS 帶來的性能開銷,NGINX 支持 HTTP/2, 所以你可以同時使用 HTTP/2 和 SSL 代理請求,而你的 Node.js 服務器不需要做任何更改。

在實現階段你需要更新 Node.js 配置文件中的 URL, 在你的 NGINX 配置文件中使用 SPDY 或者 HTTP/2 優化連接。添加 HTTP/2 支持意味著支持 HTTP/2 的瀏覽器可以使用新的協議和你的應用交互,而老的瀏覽器繼續使用 HTTP/1.x。 

 2

總結

這篇博客描述了一些 Node.js 應用程序提升性能的主要方式,主要講述了 NGINX 和 Node.js 混合使用的方式。通過 NGINX 作為反向代理, 你可以緩存靜態文件、負載均衡、代理 WebSocket 連接、配置 SSL/TLS 和 HTTP/2 協議。

NGINX 和 Node.js 混合是公認的創建微型應用服務器的友好方式,也可以靈活的擴展現存的以 SOA 為基礎的項目,比如 Java 或者 microsoft.NET 項目。這遍文章幫你優化你的 Node.js 應用程序,如果你使用 Node.js, 那么最好和 NGINX 搭配使用。

原文作者:Floyd Smith


上一篇: 前端,想說愛你不容易!

下一篇: jQuery插件開發

分享到: 更多
三公大吃小玩法规则 重庆时时彩彩官方开奖 玩奇趣分分彩有什么技巧 腾讯三公游戏下载 重庆时时彩5星人工计划 时时彩赢彩专家手机版 时时彩平台代理 pk10技巧稳赚六码 高手七星彩口诀 熊猫二人麻将换三张 赌场赌盘玩法网 吉林时时87开奖号码 欢乐生肖最新开奖 到底有没有北京时时开奖结果 北京pk是最稳全天计划 东京15分彩计划二期