Node.js是全球領先的用JavaScript——世界上最流行的編程語言建立服務器應用程序的工具。提供web服務器和應用服務器的功能,Node.js被認爲是各類以微服務爲基礎的開發和交付的關鍵工具。 css
Node.js能夠替代或加強Java和.NET用於後端應用程序的開發。html
Node.js是單線程的,而且使用非阻塞I / O,容許它擴展並支持數以萬計的並行操做。它和NGINX共享這些架構特性,並解決C10K問題——支持超過10000個併發鏈接——NGINX也能夠解決並行操做問題。 Node.js以它的高性能和高開發效率享譽全球。vue
那麼,哪裏會出問題呢?node
Node.js有一些薄弱環節和漏洞,這些薄弱環節和漏洞會使得基於Node的系統容易出現性能不佳,甚至崩潰的現象。尤爲是當基於Node.js的web應用程序碰到訪問量高速增加的時候,問題就會出現得更加頻繁。webpack
此外,Node.js是用於建立和運行產生核心可變網頁內容邏輯的強大工具。但它在服務靜態內容——例如圖像和JavaScript文件——以及平衡多個服務器上的負載這些方面還沒那麼強大。nginx
爲了最有效地使用Node.js,你須要緩存靜態內容,代理和平衡多個應用程序服務器負載,並管理客戶端、Node.js和助手——如運行Socket.IO的服務器——之間的端口競爭。 NGINX可用於解決這些問題,從而使得它成爲了一個Node.js性能優化的偉大工具。web
使用這些技巧能夠提升Node.js應用性能:面試
注:Node.js應用性能的快速解決辦法是修改你的Node.js配置,以充分利用現代多核服務器的優點。你也能夠讀一讀另外一篇關於如何讓Node.js生成單獨子進程的文章。算法
咱們在NGINX.Inc的時候,若是看到有應用程序服務器直接接觸傳入的訪問流量,用於高性能網站核心的時候,總會不自覺地有點擔心。這包括許多基於WordPress的網站,也包括Node.js網站。編程
Node.js專爲可擴展性而設計,它比大多數應用服務器更易於擴展,它的web服務器端能夠處理好大量的訪問流量。可是web服務並非Node.js存在的理由——Node.js並非由於這個目的而被構建的。
若是你有一個大流量網站,提升應用程序性能的第一步是在你的Node.js服務器前放一個反向代理服務器。這樣能夠保護Node.js服務器直接接觸外部訪問流量,還能讓你靈活使用多個應用程序服務器,平衡負載服務器,緩存內容。
在現有的服務器設置前放NGINX做爲一個反向代理服務器,是NGINX的核心用例,全世界各地已經有數以千萬計的網站實施了。
使用NGINX做爲Node.js的反向代理服務器還有一些特定的優點,其中包括:
注意:這些教程介紹瞭如何使用NGINX做爲在Ubuntu 14.04或CentOS環境中的反向代理服務器,並且能夠總覽NGINX置於node.js以前的總體狀況。
隨着基於Node.js的網站的使用量的增加,服務器的壓力開始愈來愈大。這時候你要作這兩件事情:
這實際上是很容易作到的。一開始就實施NGINX做爲反向代理服務器,就像第一點技巧中所描述的那樣。這樣就能輕易實現高速緩存、負載平衡(若是有多個Node.js服務器的話)等。
針對Modulus,一個應用程序容器平臺,有一篇很是有用的關於利用NGINX增壓Node.js應用程序性能的文章。因爲Node.js都是靠本身完成全部的工做的,因此咱們的網站平均每秒只能服務將近900個請求。使用NGINX做爲反向代理服務器,提供靜態內容,一個站點每秒可服務超過1600個請求——性能提高了近2倍。
性能的提高能讓你有時間採起額外措施以適應進訪問量的增加,如審查(或提升)網站設計,優化程序代碼,部署更多的應用程序服務器。
如下配置代碼適用運行於Modulus的網站:
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; } }
例如,在Nginx位置塊中,你可能不想要緩存某些內容。例如,你一般不會想要緩存博客平臺的管理界面的。如下就是禁用[或免除]緩存Ghost管理界面的配置代碼:
location ~ ^/(?:ghost|signout) { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_pass http://ghost_upstream; add_header Cache-Control "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0"; }
緩存NGINX服務器上的靜態文件能夠顯著減輕Node.js應用程序服務器的負載,讓它可以達到更佳性能。
本次給你們推薦一個免費的學習羣,裏面歸納移動應用網站開發,css,html,webpack,vue node angular以及面試資源等。獲取資料👈👈👈
對web開發技術感興趣的同窗,歡迎加入Q羣:👉👉👉582735936 👈👈👈,無論你是小白仍是大牛我都歡迎,還有大牛整理的一套高效率學習路線和教程與您免費分享,同時天天更新視頻資料。
最後,祝你們早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峯。
Node.js應用高性能的真正關鍵運行多個應用程序服務器和平衡負載。
Node.js負載平衡可能特別棘手,由於Node.js容許運行在web瀏覽器上的JavaScript代碼和運行在Node.js應用服務器上的JavaScript代碼作高水平的交互,同時使用JSON對象做爲數據交換的介質。這意味着,一個給定的客戶會話會持續運行在特定的應用程序服務器上,而且會話持久性用多個應用程序服務器自然地難以實現。
Internet和web的主要優勢之一就是高度無國界,其中包括經過任意服務器訪問請求文件來知足客戶端請求。Node.js顛覆了無國界,而且在有狀態的環境中——同一服務器始終如一地響應來自任意特定客戶端的請求——效果最好。
經過NGINX Plus,而非開源NGINX軟件,能夠最好地知足這個需求。NGINX的兩個版本頗爲類似,但一個主要區別就是它們對負載平衡算法的支持不一樣。
NGINX支持無狀態的負載均衡方法:
只是這些方法中的一種,IP Hash,可靠地發送指定客戶端請求到同一服務器,有利於Node.js應用程序。然而,IP Hash很容易致使某臺服務器收到的請求數量不成比例,在犧牲其餘服務器的代價下,正如這一篇博客中描述的負載均衡技術那樣。此方法支持的有狀態是以犧牲潛在不理想的跨服務器資源的請求分配爲代價的。
不一樣於NGINX,NGINX Plus支持會話持久性。在使用會話持久性的時候,同一服務器還能可靠地接收來自指定客戶端的全部請求。 Node.js的優點——在客戶端和服務器之間有狀態的通訊,以及NGINX Plus的優點——高級負載均衡能力,都達到最大化。
因此,你可使用NGINX或NGINX Plus來支持多個Node.js服務器的負載均衡。只有NGINX纔有可能讓你最大化地實現負載均衡性能和友好的Node.js有狀態性。內置於NGINX的應用健康檢查以及監控功能也頗有用。
NGINX Plus還支持會話維持,所以容許應用程序服務器在它採起中止服務的請求以後,還能優雅地完成當前會話。
HTTP,在全部版本里,是專爲「pull」通訊——來自於服務器的客戶端請求文件設計的。WebSocket是一個容許「push」和「push/pull」通訊的工具,即服務器能夠主動發送客戶端沒有請求的文件。
WebSocket協議能夠更容易地支持客戶端和服務器之間更堅固的相互做用,同時減小傳輸的數據量並最小化等待時間。當須要時,能夠實現全雙工傳輸鏈接,也就是說根據須要客戶和服務器均可以發起並接收請求。
WebSocket協議具備強大的JavaScript接口,所以很是適合做爲應用服務器的Node.js——並且,對於事務量很少的web應用程序,也能夠做爲web服務器。當事務量增長,那麼在客戶端和Node.js web服務器之間,多個應用服務器之間使用NGINX或NGINX Plus插入NGINX就有必要了。
Node.js一般與Socket.IO聯合使用,Socket.IO是一個WebSocket API,它在Node.js應用程序中很受歡迎。這可能會致使port 80(對於HTTP)或port 443(對於HTTPS)變得至關擁擠,而解決方法就是代理Socket.IO服務器。你可使用NGINX做爲代理服務器中,就像前面說的那樣,而且還得到其餘的功能,例如靜態文件緩存,負載均衡等。
如下就是做爲server.js node應用程序文件監聽port 5000的代碼。它擔當了代理服務器(而不是web服務器)的角色,並路由請求到正確的端口:
var io = require('socket.io').listen(5000); io.sockets.on('connection', function (socket) { socket.on('set nickname', function (name) { socket.set('nickname', name, function () { socket.emit('ready'); }); }); socket.on('msg', function () { socket.get('nickname', function (err, name) { console.log('Chat message by ', name); }); }); }); var socket = io(); // 這是你的初始化代碼。
有關完整的介紹,包括NGINX配置,請參閱此博客文章。有關這一類更深刻的web應用程序潛在架構和基礎設施問題,請參閱此博客文章。
愈來愈多的網站使用SSL / TLS來保護網站上全部用戶的交互。你能夠決定是否以及什麼時候作出這個舉動,但若是你選擇了這麼作,那麼NGINX有兩種方式來支持這個轉變:
在你採起這些實現步驟的時候,你還須要更新在Node.js配置文件中的URL,創建和完善在NGINX配置中的安全鏈接,必要時還可使用SPDY或HTTP / 2。添加HTTP / 2支持意味着瀏覽器版本使用新的協議支持HTTP / 2與應用程序進行通訊:老版本的瀏覽器使用HTTP / 1.x。
下面的配置代碼適用於使用SPDY的Ghost博客。它包括一些高級功能,如OCSP stapling。使用NGINX用於SSL終端,包括OCSP stapling選項,看這裏。對於同一主題的概述,看這裏。
你須要作的輕微改動就是配置Node.js應用程序,從SPDY升級到HTTP / 2,時間能夠是如今,也能夠是2016年初SPDY支持消失的時候。
server { server_name domain.com; listen 443 ssl spdy; spdy_headers_comp 6; spdy_keepalive_timeout 300; keepalive_timeout 300; ssl_certificate_key /etc/nginx/ssl/domain.key; ssl_certificate /etc/nginx/ssl/domain.crt; ssl_session_cache shared:SSL:10m; ssl_session_timeout 24h; ssl_buffer_size 1400; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/nginx/ssl/trust.crt; resolver 8.8.8.8 8.8.4.4 valid=300s; add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains'; add_header X-Cache $upstream_cache_status; location / { proxy_cache STATIC; proxy_cache_valid 200 30m; proxy_cache_valid 404 1m; proxy_pass http://ghost_upstream; proxy_ignore_headers X-Accel-Expires Expires Cache-Control; proxy_ignore_headers Set-Cookie; proxy_hide_header Set-Cookie; proxy_hide_header X-powered-by; 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 https; proxy_set_header Host $http_host; expires 10m; } location /content/images { alias /path/to/ghost/content/images; access_log off; expires max; } location /assets { alias /path/to/ghost/themes/uno-master/assets; access_log off; expires max; } location /public { alias /path/to/ghost/built/public; access_log off; expires max; } location /ghost/scripts { alias /path/to/ghost/core/built/scripts; access_log off; expires max; } location ~ ^/(?:ghost|signout) { proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_pass http://ghost_upstream; add_header Cache-Control "no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0"; proxy_set_header X-Forwarded-Proto https; } }
本文介紹了一些最重要的能夠在Node.js應用程序佈置的性能改進。它着重於添加到應用程序的NGINX以及Node.js——經過使用NGINX做爲反向代理服務器,緩存靜態文件,負載均衡,代理WebSocket鏈接,並終止SSL / TLS和HTTP / 2協議。
NGINX和Node.js的結合,被普遍認爲是一種建立新的微服務型應用程序或增長靈活性和性能到現有的基於SOA的使用Java或Microsoft .NET應用的方法。這篇文章能夠幫助你優化Node.js應用程序,讓Node.js和NGINX的夥伴關係爲你所用。
本次給你們推薦一個免費的學習羣,裏面歸納移動應用網站開發,css,html,webpack,vue node angular以及面試資源等。獲取資料👈👈👈
對web開發技術感興趣的同窗,歡迎加入Q羣:👉👉👉582735936 👈👈👈,無論你是小白仍是大牛我都歡迎,還有大牛整理的一套高效率學習路線和教程與您免費分享,同時天天更新視頻資料。最後,祝你們早日學有所成,拿到滿意offer,快速升職加薪,走上人生巔峯。