提醒Node利用机能的5个技巧
相关引荐:《node js教程》
“假如你的 node 效劳器前面没有 nginx, 那么你大概做错了。”— 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 机能的倡议:
实现一个反向代理效劳器
缓存静态文件
多效劳器负载平衡
代理 WebSocket 连接
实现 SSL/TLS 和 HTTP/2
注:晋升 Node.js 利用机能的最快办法是修改你的 Node.js 文件来利用多核处置器,查看这篇文章来学习怎样充分利用效劳器上的多核CPU。
一、实现一个反向代理效劳器
比拟大多数利用效劳器,Node.js 可以很轻松的处置大量的网络流量,但这并不是 Node.js 的设计初衷。
假如你有一个高流量的站点,提高机能的第一步是在你的 Node.js 前面放一个反向代理效劳器。这可以庇护你的 Node.js 效劳器免于直接显露在网络中,并且可以同意你灵敏的使用多个利用效劳器做负载平衡和静态文件缓存。
使用 NGINX 在一个已经存在的效劳器前做反向代理,作为 NGINX 的一个中心利用,已经被用于全世界成千上万的站点中。
下面是使用 NGINX 作为反向代理效劳器的长处:
简化了权限处置和端口分配
更高效的处置静态资源
更好的处置 Node.js 崩溃状况
缓解 DoS 攻击的影响
注:这篇文章说明怎样在 Ubuntu 14.04 或者 CentOS 环境中使用 NGINX 做反向代理效劳器,并且使用 NGINX 在 Node.js 前做反向代理效劳器是有效的。
二、缓存静态文件
随着流量的增长,以 Node 为根基的效劳器开端闪现压力。这时,你大概想做两件事:
1、使用更多的 Node.js 效劳器。
2、在多个效劳器间做负载平衡
这其实很简便,NGINX 一开端就是作为反向代理效劳器来实现的,这使其很容易做缓存和负载平衡等。
Modulus 的网站有一篇有用的文章,介绍了使用 NGINX 做 Node.js 反向代理效劳器的机能晋升。只使用 Node.js 时,作者的网站每秒能处置 900 个恳求。 使用 NGINX 作为反向代理效劳器来处置静态文件后,该网站每秒可处置超越 1600 个恳求,接近两倍的机能晋升。
下面是该网站做上述机能晋升的配置代码:
nginx
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; } }
三、实现 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 利用效劳器受益。
四、代理 WebSocket 连接
所有版本的 HTTP 都是为客户端主动恳求效劳器来设计的,而 WebSocket 可以实现效劳器主动向客户端的新闻推送。
WebSocket 和谈使客户端和效劳器端的不乱交互愈加简便,同时也供给更小的交互延迟。当你需要一个全双工的通讯,即客户端和效劳器都可以在需要时主动发起新闻恳求,那么使用 WebSocket 就对了。
WebSocket 和谈有健全的 JavaScript 接口,因此也原生适合用 Node.js 作为利用效劳器。当连接数上升,使用 NGINX 在客户端和 Node.js 效劳器端做代理来缓存静态文件和负载平衡就变得非常成心义。
五、实现 SSL/TLS 和 HTTP/2
越来越多的网站使用 SSL/TLS 来包管信息交互的平安性,你也可以思考可否要把它参加到你的网站中,但假如你决议要做,那么 NGINX 有两种方式来支撑它:
你可以使用 NGINX 做 SSL/TLS 反向代理,Node.js 效劳器使用解密后的恳求然后返回未加密的内容给 NGINX。
使用 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。
总结
这篇博客描写了一些 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
原文链接:https://www.nginx.com/blog/5-performance-tips-for-node-js-applications/
译文链接:https://blog.maxleap.cn/zh/archives/512