提升 Node.js 应用性能的 5 个技巧

Node.js是全球领先的用JavaScript——世界上最流行的编程语言创建服务器应用程序的工具。提供web服务器和应用服务器的功能,Node.js被认为是各种以微服务为基础的开发和交付的关键工具。

Node.js可以替代或增强Java和.NET用于后端应用程序的开发。

Node.js是单线程的,并且使用非阻塞I / O,允许它扩展并支持数以万计的并行操作。它和NGINX共享这些架构特性,并解决C10K问题——支持超过10000个并发连接——NGINX也可以解决并行操作问题。 Node.js以它的高性能和高开发效率享誉全球。

那么,哪里会出问题呢?

Node.js有一些薄弱环节和漏洞,这些薄弱环节和漏洞会使得基于Node的系统容易出现性能不佳,甚至崩溃的现象。尤其是当基于Node.js的web应用程序碰到访问量高速增长的时候,问题就会出现得更加频繁。

此外,Node.js是用于创建和运行产生核心可变网页内容逻辑的强大工具。但它在服务静态内容——例如图像和JavaScript文件——以及平衡多个服务器上的负载这些方面还没那么强大。

为了最有效地使用Node.js,你需要缓存静态内容,代理和平衡多个应用程序服务器负载,并管理客户端、Node.js和助手——如运行Socket.IO的服务器——之间的端口竞争。 NGINX可用于解决这些问题,从而使得它成为了一个Node.js性能优化的伟大工具。

使用这些技巧可以提高Node.js应用性能:

  1. 实现反向代理服务器
  2. 缓存静态文件
  3. 多服务器的负载均衡
  4. 代理WebSocket连接
  5. 实现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服务器直接接触外部访问流量,还能让你灵活使用多个应用程序服务器,平衡负载服务器,缓存内容。

提升 Node.js 应用性能的 5 个技巧

在现有的服务器设置前放NGINX作为一个反向代理服务器,是NGINX的核心用例,全世界各地已经有数以千万计的网站实施了。

使用NGINX作为Node.js的反向代理服务器还有一些特定的优势,其中包括:

  • 简化操作权限和端口分配
  • 更有效地服务于静态图像(见第二个小窍门)
  • 成功管理Node.js崩溃的情况
  • 减轻DoS***

注意:这些教程介绍了如何使用NGINX作为在Ubuntu 14.04或CentOS环境中的反向代理服务器,而且可以总览NGINX置于node.js之前的整体情况。

2.缓存静态文件

随着基于Node.js的网站的使用量的增长,服务器的压力开始越来越大。这时候你要做这两件事情:

  1. 充分利用Node.js服务器。
  2. 使得添加应用程序服务器和负载均衡变得容易。

这其实是很容易做到的。一开始就实施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以及面试资源等。**获取资料

猜你喜欢

转载自blog.51cto.com/14145734/2394375