< p > 推荐读数:
发挥JAVA基础的网络、并行编程和设计模式,为春季培训
打下良好基础秋季招聘面试总结:Java+并发+Spring+MySQL+分布式+Redis+算法+JVM等。
阿里技术官总结了20多个高并发编程的必要知识点,你能做到吗?
是“再贴现的灾难”,它几乎使我挂在美国团的三面。这真的是一场“虚惊”
早在2012年,PHP和Ruby on Rails仍然是管理呈现web应用程序的服务器端技术。然而,一个大胆的竞争对手在社区掀起了一场风暴。在那一年的一篇博客文章中,声称已经通过百万级并发连接测试的技术不是别人,正是Node.js,从那以后,它的受欢迎程度稳步提高。
与当时大多数类似的技术不同,Node.js有自己的网络服务器。拥有这个服务器意味着开发人员可以绕过各种配置文件,比如php.ini和包含几个的层次结构。htaccess文件。内置的网络服务器还提供了其他便利,例如处理上传文件的能力或实现网络套接字的简易性。 由Node.js驱动的网络应用程序每天都能顺利处理数亿个请求世界上大多数大公司在某些方面都受到Node.js的影响说Node.js可以在生产环境中使用肯定是保守的说法。然而,对于构建Node.js:
仍然有一个适用的建议不应该将Node.js进程直接暴露给网络,而是应该将其隐藏在反向代理之后。
在我们揭示原因之前,让我们看看它是什么。
什么是反向代理?
反向代理基本上是一个特殊的网络服务器,它接受请求并将它们转发到另一个HTTP服务器。它还接受响应并将它们转发回原始请求者。
反向代理通常不会准确发送原始请求,通常会以某种方式修改请求。例如,如果反向代理位于www.example.org:80并将请求转发到ex.example.org:8080,它可能会重写原始主机头以匹配目标地址反向代理也可以以其他方式修改请求,例如清除有缺陷的请求或在协议之间进行转换。
一旦反向代理收到响应,它也可能以某种方式转换它常见的方法是修改主机头以匹配原始请求。
请求的正文也可以修改一个常见的修改是执行gzip压缩作为响应另一个常见的变化是,当底层服务仅是HTTP时,启用HTTPS支持
反向代理还可以将传入请求分发到多个后端实例如果服务暴露给api.example.org,反向代理可以将请求转发给api1.internal.example.org、api2.internal.example.org等。
有许多不同的反向代理两个更受欢迎的是Nginx和HAProxy。这两种工具都可以执行gzip压缩,增加HTTPS支持,也可以很好地应用到其他领域。Nginx更受欢迎,并且具有其他有益的功能,例如从文件系统运行静态文件服务器,因此我们将在本文中使用它作为示例。
现在我们知道了什么是反向代理,让我们看看为什么我们要将它用于Node.js
为什么要使用反向代理?
SSL终端
SSL终端是使用反向代理的最重要原因之一将应用程序的协议从http更改为https就像添加一个S字母一样简单。Node.js本身可以在https上执行必要的加密和解密,也可以配置为读取必要的证书文件。
但是,配置与我们的应用程序通信的协议和管理永不过期的SSL证书并不是我们的应用程序真正需要注意的事情。在代码库中检查证书不仅麻烦,而且有安全风险。当应用程序启动时,从特定位置获取证书也有风险。
有鉴于此,最好在应用程序之外执行SSL终端,通常由反向代理承担多亏了certbot这样的技术,通过Nginx维护证书就像设置一个预定的任务一样简单。这样的任务可以自动安装新的证书,并动态地重新配置Nginx进程这是一个比重新启动每个Node.js应用程序实例更少干扰的过程。
同时,通过允许反向代理执行SSL终端,这也意味着只有反向代理的作者编写的代码才能访问您的私有SSL证书相反,如果您的Node.js应用程序处理SSL,那么您的应用程序使用的每个第三方模块(甚至是潜在的恶意模块)都可以访问您的私有SSL证书。
Gzip压缩
gzip是您应该从应用程序转移到反向代理的另一个功能。Gzip压缩策略最好在管理级别设置,而不是必须为每个应用程序指定和配置。
最好使用一些逻辑来决定gzip的用途。例如,一个非常小的文件,可能小于1kb,可能不值得压缩,因为它的gzip压缩版本可能会变得更大,或者客户端解压缩它的CPU开销不太划算同时,当处理二进制数据时,根据其格式,它也可能不会受益于压缩。有时gzip不能简单地启用或禁用。为了与压缩算法兼容,有必要检查接收到的接受编码报头
聚类
JavaScript是单线程语言。相应地,Node.js也是单线程服务器平台(尽管Node.js v10中开始出现的实验性工作线程支持致力于改变这一点)这意味着要从一个节点获得尽可能多的吞吐量,js应用程序需要运行与CPU内核数量大致相同的实例
Node.js的集群模块可以实现集群。收到的HTTP请求将被移交给主进程,然后分发给集群工作人员。
但是,动态扩展集群工作器可能有点困难通常通过运行一个额外的Node.js进程作为分发主进程来提高吞吐量。然而,对于集群来说,跨机器扩展的过程仍然有点太困难。
由于这些原因,有时最好使用反向代理来分发正在运行的Node.js进程。反向代理可以被动态配置为指向新兴的应用程序进程老实说,应用程序应该只关注自己的工作,而不是管理多个副本和分发请求
企业路由
当从大型网络应用程序开始时,使用反向代理来决定如何转发请求是非常有用的,尤其是那些由拥有多个团队的企业创建的应用程序。例如,指向example.org/search/*的请求可以被路由到内部搜索应用,而指向example.org/profile/*的其他请求可以被分发到内部数据应用
诸如之类的处理提供了其他强大的功能,如粘性会话、蓝/绿部署、模拟/模拟测试等。就我个人而言,我在这样一个代码库中工作过,在这里应用程序执行这些逻辑。这种实现使得应用程序极难维护。
性能增益
Js是高度可塑性的。它可以从文件系统设置静态资源服务,对HTTP响应执行gzip压缩,内部支持HTTPS,以及许多其他功能它甚至能够运行一个应用程序的多个实例,并通过集群模块分发自己的请求。但是,让反向代理来处理这些操作,而不是依赖于Node.js应用程序,这符合我们的利益。除了上面列出的原因,在Node.js之外执行这些操作的另一个原因是效率。
SSL加密和gzip压缩是两种高度计算密集型操作特殊的反向代理工具,如Nginx和HAProxy,专门处理这些操作,执行速度比Node.js快使用像Nginx这样的网络服务器从磁盘上读取静态内容也比使用Node.js要快有时,与额外的Node.js进程相比,Nginx反向代理效率更高,占用的内存和CPU更少。
,但是,耳朵是空的让我们运行一些基准测试!
下的负载测试使用围攻进行我们运行并发值为10的命令(模拟用户的请求),该命令将迭代运行20,000次(总共将有200,000个请求)
为了验证内存使用情况,我们在基准测试期间运行命令pmap | grep总计数次并取平均值作为结果当Nginx用单个工作线程运行时,最终会运行两个实例,一个是主线程,另一个是工作线程。然后将两个值相加当运行具有两个节点的Node.js集群时,将有3个进程,一个是主进程,另两个是工作进程下表中的大约内存列是给定测试中每个引擎和节点进程的总和。
基准结果
我们在节点集群基准测试中使用了2个工作进程,这意味着有3个节点js进程在运行:1个主进程和2个工作进程在nginx-cluster-node基准测试中,我们有两个Node.js进程在运行。每个引擎测试都有一个独立的引擎主进程和一个独立的引擎工作进程。基准测试包括从磁盘读取文件,并且Nginx和Node.js都被配置为将文件缓存在内存中。
使用Nginx使节点. js执行SSL终端的吞吐量增加了约16%(从746rps增加到865rps)使用Nginx的Gzip压缩将吞吐量提高了约50%(5,047rps至7,590rps)使用Nginx来管理进程集群导致了大约1%的性能损失(8,006rps到7,908rps),这可能是由于在环回网络设备之间传递额外请求的开销。
一个基本节点. js单个进程使用大约600兆字节的单个内存,而Nginx进程使用大约50兆字节根据所使用的功能,这些用法会略有波动。例如,Node.js使用额外的13MB来执行SSL终端,而Nginx使用额外的4MB来充当Node.js的反向代理,并设置一个从文件系统读取静态内容的服务。有趣的是,Nginx在其整个生命周期中都保持了稳定的内存吞吐量。然而,由于JavaScript的自然垃圾收集机制,Node.js的内存吞吐量经常波动
以下是此基准测试的软件版本:
Nginx: 1.14.2 Node.js: 10.15.3 围攻:3.0.8测试是在一台内存为16GB的机器上进行的,该机器的处理器为i7-7500U,处理器为4×2.70千兆赫,内核为4.19.10项目地址位于:github.com/IntrinsicLa…
简化应用程序代码
基准测试是全面而出色的,但是在我看来,将一些工作从Node.js应用程序转移到反向代理的最大好处是代码简化。我们能够减少可能导致潜在错误的必须应用的代码量,并用声明性配置代替它。开发人员普遍认为,他们更有信心让Nginx和其他外部团队编写这部分代码,而不是自己编写。
不同于在多个Node.js项目中安装和管理gzip压缩中间件并使其保持最新。我们可以在一个地方配置它。与加载SSL证书后重新启动应用程序不同,我们可以使用现有的证书管理工具。与其向应用程序添加条件语句来检查流程是主流程还是辅助流程,不如让其他工具来判断。
反向代理允许我们的应用程序专注于业务逻辑,而忽略协议和流程管理
虽然Node.js具有在生产环境中运行的完美能力,但是反向代理和生产环境中的HTTP Node.js应用的结合带来了各种好处。像SSL和gzip这样的操作变得更快管理SSL证书也更容易也减少了大量所需应用程序代码
< p >作者:蒋早tonylua
链接:https://juejin.im/post/5e3015af5188254c23704ee1