当前位置: 首页 > Web前端 > HTML5

提高Node.js应用程序性能的5个技巧

时间:2023-04-05 20:59:57 HTML5

Node.js是世界领先的工具,用于使用世界上最流行的编程语言JavaScript创建服务器应用程序。Node.js提供Web服务器和应用程序服务器的功能,被认为是各种基于微服务的开发和交付的关键工具。Node.js可以替代或扩充用于后端应用程序开发的Java和.NET。Node.js是单线程的并且使用非阻塞I/O,允许它扩展并支持数以万计的并行操作。它与NGINX共享这些架构特性,在解决C10K问题——支持1万以上并发连接——的同时,NGINX还可以解决并行操作问题。Node.js以其高性能和高开发效率而闻名于世。那么哪里会出错呢?Node.js存在一些薄弱环节和漏洞,这些薄弱环节和漏洞会使基于Node的系统容易出现性能不佳甚至崩溃的情况。尤其是当基于Node.js的Web应用遇到流量的高速增长时,问题出现的频率会更高。此外,Node.js是用于创建和运行生成核心可变Web内容的逻辑的强大工具。但它在提供静态内容(例如图像和JavaScript文件)以及跨多个服务器平衡负载方面没有那么强大。要最有效地使用Node.js,您需要缓存静态内容、代理和负载平衡多个应用程序服务器,并管理客户端、Node.js和帮助程序(例如运行Socket.IO的服务器)之间的端口竞争。NGINX可以用来解决这些问题,使其成为Node.js性能优化的绝佳工具。使用这些技巧来提高Node.js应用程序的性能:实施反向代理服务器以缓存静态文件负载平衡多个服务器代理WebSocket连接实施SSL/TLS和HTTP/2注意:Node.js应用程序性能的快速修复是修改您的Node.js配置以充分利用现代多核服务器。您还可以阅读另一篇关于如何使Node.js生成单独的子进程的文章。1.实现反向代理服务器我们在NGINX.Inc的时候,如果看到一个应用服务器直接接触进来的访问流量,当它作为一个高性能网站的核心时,我们总会不自觉地有点担心。这包括许多基于WordPress的站点,但也包括Node.js站点。Node.js是为可扩展性而设计的,它比大多数应用程序服务器更容易扩展,而且它的Web服务器端可以处理大量的流量。但是Web服务并不是Node.js存在的理由——Node.js并不是为此目的而构建的。如果你有一个高流量的网站,提高应用程序性能的第一步是在你的Node.js服务器前面放置一个反向代理服务器。这可以防止Node.js服务器直接访问外部流量,还可以让您灵活地使用多个应用程序服务器、负载平衡服务器和缓存内容。将NGINX置于现有服务器设置之前作为反向代理服务器是NGINX的核心用例,并且已被全球数千万个网站实施。使用NGINX作为Node.js的反向代理服务器还有一些特定的优势,包括:简化操作权限和端口分配更有效地提供静态图像(参见第二个技巧)成功管理Node.js崩溃场景减轻DoS攻击注意:这些教程描述了如何在Ubuntu14.04或CentOS环境中使用NGINX作为反向代理服务器,并在node.js之前提供了NGINX的概述。2.缓存静态文件随着基于Node.js的网站使用量的增加,服务器的压力开始增加。此时你必须做两件事:充分利用Node.js服务器。使添加应用程序服务器和负载平衡变得容易。这实际上很容易做到。如第一个提示中所述,从一开始就将NGINX实现为反向代理服务器。这允许轻松缓存、负载平衡(如果您有多个Node.js服务器)等。对于应用程序容器平台Modulus,有一篇关于使用NGINX增强Node.js应用程序性能的非常有用的文章。由于Node.js自行完成所有工作,我们的网站平均每秒只能处理近900个请求。使用NGINX作为反向代理服务器来提供静态内容,一个站点每秒可以处理超过1,600个请求——性能提高了近2倍。改进的性能让您有时间采取额外的措施来适应流量的增加,例如审查(或改进)您的站点设计、优化您的代码以及部署更多的应用程序服务器。以下配置代码适用于运行在Modulus上的网站:server{listen80;服务器名称static-test-47242.onmodulus.net;根/mnt/应用程序;indexindex.htmlindex.htm;位置/静态/{try_files$uri$uri/=404;}location/api/{proxy_passhttp://node-test-45750.onmodulus.net;}}例如,在Nginx位置块中,您可能不想缓存某些内容。例如,您通常不想缓存博客平台的管理界面。下面是禁用[或免除]缓存Ghost管理接口的配置代码:location~^/(?:ghost|signout){proxy_set_headerX-Real-IP$remote_addr;proxy_set_header主机$http_host;proxy_passhttp://ghost_upstream;add_headerCache-Control"no-cache,private,no-store,must-revalidate,max-stale=0,post-check=0,pre-check=0";在NGINX服务器上缓存静态文件可以显着减轻Node.js应用服务器的负载,使其获得更好的性能。这次给大家推荐一个免费学习群,里面总结了移动应用网站开发,css,html,webpack,vuenodeangular,面试资源。获取信息???欢迎对web开发技术感兴趣的同学加入Q群:???582735936???,不管你是小白还是大牛我都欢迎,还有大牛整理的一套高效学习路线和教程免费分享给你,每天更新视频资料。最后祝大家早日学业有成,拿到满意的offer,快速升职加薪,走上人生巅峰。3.实现Node.js负载平衡Node.js应用程序高性能的真正关键是运行多个应用程序服务器并平衡负载。Node.js负载平衡可能特别棘手,因为Node.js允许在Web浏览器上运行的JavaScript代码与在Node.js应用程序服务器上运行的JavaScript代码进行高层交互,使用JSON对象作为数据交换的媒介。这意味着给定的客户端会话将在特定的应用程序服务器上持久存在,而会话持久性本质上很难通过多个应用程序服务器实现。Internet和Web的主要优点之一是它是高度无边界的,这包括通过从任意服务器访问请求的文件来满足客户端请求。Node.js颠覆了无状态并在有状态环境中发挥最佳作用——在有状态环境中,同一台服务器始终响应来自任何给定客户端的请求。这种需求最好由NGINXPlus来满足,而不是开源的NGINX软件。NGINX的两个版本非常相似,但一个主要区别是它们对负载平衡算法的支持。NGINX支持一种无状态的负载均衡方法:roundrobin。新请求转到列表中的下一个服务器。最少的连接。新请求发送到活动连接最少的服务器。IP哈希。新请求发送到散列客户端IP地址的服务器。IPHash是这些方法中的一种,它通过可靠地将特定客户端请求发送到同一服务器来对Node.js应用程序很有用。但是,IPHash很容易导致一个服务器以其他服务器为代价接收到不成比例的请求,就像本博客中描述的负载均衡技术一样。此方法支持的状态性是以跨服务器资源的请求分布可能不理想为代价的。与NGINX不同,NGINXPlus支持会话持久化。使用会话持久性时,同一台服务器还可以可靠地接收来自给定客户端的所有请求。Node.js的优势——客户端和服务器之间的有状态通信,以及NGINXPlus的优势——先进的负载均衡能力,被发挥到了极致。因此,您可以使用NGINX或NGINXPlus来支持多个Node.js服务器的负载均衡。只有NGINX可以让您最大限度地提高负载平衡性能和友好的Node.js状态。NGINX内置的应用程序健康检查和监控功能也很有用。NGINXPlus还支持会话持久化,从而允许应用服务器在收到停止服务请求后优雅地完成当前会话。4.通过HTTP代理WebSocket连接,在所有版本中,都是为“拉”通信而设计的——客户端从服务器请求文件。WebSocket是一种允许“推”和“推/拉”通信的工具,即服务器可以主动发送客户端没有请求的文件。WebSocket协议可以更轻松地支持客户端和服务器之间更强大的交互,同时减少传输的数据量并最大限度地减少延迟。在需要时,可以实现全双工传输连接,即客户端和服务端都可以根据需要发起和接收请求。WebSocket协议具有强大的JavaScript接口,因此非常适合Node.js。js作为应用服务器——而且,对于交易量不大的web应用,它也可以作为web服务器。当交易量增大时,需要使用NGINX或NGINXPlus,在客户端和Node.jsweb服务器之间,或者多个应用服务器之间插入NGINX。Node.js通常与Socket.IO结合使用,Socket.IO是一种在Node.js应用程序中很流行的WebSocketAPI。这会导致端口80(用于HTTP)或端口443(用于HTTPS)变得相当拥塞,解决方案是代理Socket.IO服务器。你可以像前面提到的那样使用NGINX作为代理服务器,还可以获得其他特性,比如静态文件缓存、负载均衡等。下面是作为server.js节点应用文件监听5000端口的代码。它充当代理服务器(而不是Web服务器)并将请求路由到正确的端口:vario=require('socket.io').listen(5000);io.sockets.on('connection',function(socket){socket.on('设置昵称',function(name){socket.set('昵称',name,function(){socket.emit('ready');});});socket.on('msg',function(){socket.get('nickname',function(err,name){console.log('Chatmessageby',name);});});});varsocket=io();//这是你的初始化代码。有关完整的介绍,包括NGINX配置,请参阅此博客文章。请参阅此博客文章,了解更深入的Web应用程序潜在架构和此类基础架构问题。5.实施SSL/TLS和HTTP/2越来越多的网站使用SSL/TLS来保护网站上的所有用户交互。您可以决定是否以及何时进行此操作,但如果您选择这样做,NGINX有两种方式来支持此转换:如果您将NGINX设置为反向代理,则可以终止与NGINX中客户端的SSL/TLS连接。Node.js服务器使用Nginx反向代理服务器来回发送和接收未加密的请求和内容。早期迹象表明,使用HTTP/2(新HTTP协议的新版本)可以在很大程度上或完全抵消使用SSL/TLS带来的性能损失。NGINX支持HTTP/2,您可以终止HTTP/2和SSL,而无需对Node.js应用程序服务器进行任何更改。在执行这些实施步骤时,您还需要更新Node.js配置文件中的URL,在NGINX配置中建立并完成安全连接,并在必要时使用SPDY或HTTP/2。添加HTTP/2支持意味着浏览器版本使用支持HTTP/2的较新协议与应用程序通信:旧浏览器使用HTTP/1.x。下面的配置代码适用于使用SPDY的Ghost博客。它包括一些高级功能,例如OCSP装订。使用NGINX进行SSL终止,包括OCSP装订选项,请参见此处。有关同一主题的概述,请参见此处。您需要做的细微更改是配置您的Node.js应用程序以从SPDY升级到HTTP/2,无论是现在还是在2016年初SPDY支持终止时。服务器{server_namedomain.com;听443sslspdy;spdy_headers_comp6;spdy_keepalive_timeout300;keepalive_timeout300;ssl_certificate_key/etc/nginx/ssl/domain.key;ssl_certificate/etc/nginx/ssl/domain.crt;ssl_session_cache共享:SSL:10m;ssl_session_timeout24小时;ssl_buffer_size1400;ssl_stapling开启;ssl_stapling_verify开启;ssl_trusted_certificate/etc/nginx/ssl/trust.crt;解析器8.8.8.88.8.4.4有效=300s;add_headerStrict-Transport-Security'max-age=31536000;包括子域';add_headerX-Cache$upstream_cache_status;位置/{proxy_cacheSTATIC;proxy_cache_valid20030m;proxy_cache_valid4041m;proxy_passhttp://ghost_upstream;proxy_ignore_headersX-Accel-ExpiresExpiresCache-Control;proxy_ignore_headers设置Cookie;proxy_hide_header设置-Cookie;proxy_hide_headerX-powered-by;proxy_set_headerX-真实IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_headerX-Forwarded-Protohttps;proxy_set_header主机$http_host;10m到期;}location/content/images{别名/path/to/ghost/content/images;access_log关闭;过期最大值;}location/assets{别名/path/to/ghost/themes/uno-master/assets;access_log关闭;过期最大值;}location/public{别名/path/to/ghost/built/public;access_log关闭;过期最大值;}location/ghost/scripts{别名/path/to/ghost/core/built/scripts;access_log关闭;过期最大值;}location~^/(?:ghost|signout){proxy_set_headerX-Real-IP$remote_addr;proxy_set_header主机$http_host;proxy_passhttp://ghost_upstream;add_header缓存控制“无缓存,私有,无存储,必须重新验证,最大陈旧=0,发布-check=0,pre-check=0";proxy_set_headerX-Forwarded-Protohttps;}}结论本文描述了一些可以在Node.js应用程序中实现的最重要的性能改进。它着重于将NGINX添加到application和Node.js——通过使用NGINX作为反向代理服务器,缓存静态文件,负载均衡,代理WebSocket连接,终止SSL/TLS和HTTP/2协议。NGINX和Node.js的结合被广泛认为是一个A使用Java或Microsoft.NET创建新的基于微服务的应用程序或为现有的基于SOA的应用程序增加灵活性和性能的方法。本文可以帮助您优化Node.js应用程序,让Node.js和NGINX合作伙伴供您使用。这次给大家推荐一个免费学习群,里面总结了移动应用网站开发,css,html,webpack,vuenodeangular,面试资源。获取资料???web开发技术感有兴趣的同学欢迎加入Q群:???582735936???,无论你是小白还是大牛,我都欢迎你。还有大牛整理的一套高效学习路线和教程,免费分享给大家。更新视频信息。最后祝大家早日学业有成,拿到满意的offer,快速升职加薪,走上人生巅峰。