Apache & Nginx & Node JS & Tomcat架构比较

这么多年,用的Web服务器也有几个了,每个服务器的架构如何,我觉得有必要整理并做个比较。这篇文章中的图片都来自互联网,文字大多也是翻译过来的,主要目的还是供自己参考。

 

Nginx是一个基于事件的Web服务器,架构图如下:

nginx architecture

如何工作

基于事件也就意味着使用消息或者信号来标志一个进程的初始化和完成。因此,一个进程的资源在初始化事件触发后可以被其他进程使用,资源可以被动态的分配和释放,使得CPU和内存可被优化使用。

nginx worker

 

Apache是一个基于进程的Web服务器

在基于进程的服务器中,并发连接需要更多的线程,在高并发时消耗更多的内存,并且性能严重下降。

Apache架构图如下:

apache Architecture

 

使用Nginx还是Apache

在决定是使用Nginx还是Apache时,有不少因素需要考虑,上述的优缺点可以帮助决策。如果你想让静态内容访问更高的性能,一般来说就要选Nginx,而且Nginx在可扩展性、流媒体、VPS主机、反向代理方面有更好的支持。

反过来,Apache在其他场景可能更加适合。很多用户通过修改.htaccess文件来配置Web服务其,而这个在Nginx中不存在。另外,Apache更容易共享宿主机环境并提供一个修改服务端的控制面板,同时Apache有更大的用户群也给初学者提供更易懂的学习内容。

Node JS,基于Event Loop的单线程模型,其处理步骤如下

  1. Clients发送请求到Web服务器;
  2. Node JS Web服务器内部维护一个线程个数有限的线程池来处理Client请求;
  3. Node JS Web将这些请求放进队列,叫“Event Queue”,即事件队列;
  4. Node JS Web内部有个组件叫 “Event Loop”,它是因为用一个无线循环来接收请求并处理而得名;
  5. Event Loop使用单线程,它是Node JS平台处理模型的核心;
  6. Even Loop检查每个放进了消息队列的请求,如果没有,则等待消息到来,否则从队列中取出一个消息:
    1) 开始处理Client请求;
    2)如果Client不需要任何Blocking IO操作,则直接处理并准备数据,返回到客户端;
    3) 如果Client需要一些Blocking IO操作比如和数据库、文件系统、外部服务交互,则采用不同的方式:
  • a. 从线程池找到可用的线程;
  • b. 将Client请求交给这个线程处理;
  • c. 这个线程处理请求,进行 Blocking IO操作,准备Response内容,并返回到Event Loop;
  • d. Event Loop再将Response内容返回给Client;

Node JS架构图如下:

NodeJS-Single-Thread-Event-Model

Tomcat总体架构

图 1.Tomcat 的总体结构

Server

在Tomcat中,一个Server代表整个容器(container)。Tomcat提供了Server接口的一个默认实现,一般很少需要自己配置。

Service

一个Service是一个中间组件,包含在Server中,并且将一个或多个Connector绑定到一个唯一的Engine。Service的元素也很少需要用户自己配置,默认的实现已经足够简单和满足效率。

Engine

Engine代表一个Service的处理流水线。一个Service可能有多个Connectors,Engine处理这些connectors的所有请求,并将结果返回给connector,后者再返回给客户端。Engine的接口可以实现定制化,但通常很少这样做。

Host

一个Host是一个网络名称如www.yourcompany.com和Tomcat服务器的一个关联。一个Engine可能包含多个Host,用户很少需要创建定制的Host,因为StandardHost的实现已经提供了很多的功能。

Connector

Connector负责和Client通讯,Tomcat中有多个 Connector,包括处理HTTP流量的HTTP Connector,尤其是在Tomcat以一个单独的服务运行时。当Tomcat连接到Apache HTTPD服务器时,使用AJP connector,它实现了 AJP协议。自定义Connector需要花费很大的功夫。

Context

一个Context代表一个Web应用。一个Host可以包含多个Context,每个都有唯一的路径。 可以通过实现Context接口来定制化Context,但很少需要这么做,因为StandardContext已经提供了很多额外的功能。

发表评论

电子邮件地址不会被公开。