web服务器、应用服务器、web容器、反向代理服务器区别与联系

动态资源处理模块

运行业务逻辑处理,动态决定返回的资源内容和类型,内容和类型的处理原则同上。

后处理

根据和用户协商的协议进行加密,压缩,安全处理等等。

资源输出模块

把处理好的内容和类型封装成HTTP报文,往TCP连接另一头的用户代理发送TCP报文(内容是HTTP报文)。

主流Web服务器

包括Apache、IIS 、Nginx,市场占有率如下

web服务器、应用服务器、web容器、反向代理服务器区别与联系


还有比较多使用Tomcat,Jetty,WebSphere,WebLogic,Kerstrel等等。

1.2. Web应用程序容器概念与基本原理

1.2.1. Web应用程序容器的由来

Web服务器的出现的标志着WWW时代的带来,世界变得更加平面化。当初尝到甜头的开创者们开始不满足与在互联网上获取静态资源,于是出现了CGI脚本来动态获取资源。再后来网络发展方向也是朝着增强Web服务器动态获取资源的能力前进。以下是代表性的动态技术:


web服务器、应用服务器、web容器、反向代理服务器区别与联系



1.2.2. Web应用程序容器的基本工作原理

一般情况下Web应用程序容器是以下构成体系:


web服务器、应用服务器、web容器、反向代理服务器区别与联系



注:浅蓝色的模块是实现业务程序的主要使用模块。

相对于Web服务器,该容器新增或强化了以下模块:

分配线程池资源

容器为每个请求分配一个线程进行处理,通常采取线程池的方式高效理由CPU算资源。

封装Request上下文

一个请求对应一个Request上下文,它主要封装了用户请求的主要构成。URL,HTTP请求头,以及基于请求头构建的Session,Cookie等对象,方便编程使用。

封装Response上下文

一个请求对应一个Response上下文,主要用于向用户代理返回资源。可以在其中写入输出流,或者重定向,或者返回错误码等等。

URL路由

在容器里,运行开发人员设置不同的路由匹配规则,比如让.HTM返回.HTML,也可以自定义.xyz返回.HTML资源。更加灵活的配置可以参考JAVA MVC或者ASP.NET MVC的配置方案。

动态资源处理模块

通常在这里具体的容器和开发语言都有自己的高效开发模型,比如JAVA的Servlet,ASP.NET的Web Form,MVC。

回收资源

这里会回收刚才的线程资源,为了线程复用,除非服务器空闲一般会将线程返回线程池。

可以看出,Web容器本身具备了做为一个Web服务器的功能,事实上通常实现Web容器功能的服务器就是一个Web服务器。比如Tomcat , IIS ,Jetty。

主流Web容器

包括Tomcat , IIS ,Jetty 。

还有比较多使用WebSphere,WebLogic等等。

1.3. Web应用程序服务器概念及基本原理

在Web服务器发展的同一个时期,应用服务器已经存在并发展很长一段时间了。一些公司为Unix开发了Tuxedo(面向事务的中间件)、TopEnd、Encina等产品,这些产品都是从类似IMS和CICS的主机应用管理和监控环境衍生而来的。大部分的这些产品都指定了“封闭的”产品专用通信协议来互连胖客户机(“fat” client)和服务器。

在90年代,这些传统的应用服务器产品开始嵌入HTTP通信功能,刚开始要利用网关来实现。不久后它们之间的界线开始变得模糊了。

同时,web服务器越来越成熟,可以处理更高的负载、更多的并发和拥有更好的特性;应用服务器开始添加越来越多的基于HTTP的通信功能。所有的这些导致了web服务器与应用服务器的界线变得更窄了。

目前,“应用服务器”和“web服务器”之间的界线已经变得模糊不清了。但是人们还把这两个术语区分开来,作为强调使用。

当有人说到“web服务器”时,你通常要把它认为是以HTTP为核心、web UI为向导的应用。当有人说到“应用服务器”时,你可能想到“高负载、企业级特性、事务和队列、多通道通信(HTTP和更多的协议)”。但现在提供这些需求的基本上都是同一个产品。

下图描述一个典型的Web应用服务器的结构图:


web服务器、应用服务器、web容器、反向代理服务器区别与联系


从上图中可以看到Web应用服务器包括了Web容器,同时内置了支撑企业应用的事务,安全,集成,通信,高可用等等功能,极大了减少了重复开发量,保障了业务系统快速开发和部署,而它本身也是一个Web服务器。

Web应用服务器可以选择使用大厂的WebLogic和WebSphere这种重量级产品外,也可以使用类似与Tomcat、jetty这样的web containner 再加上第三方的框架(spring,hibernate等)来构建自己的Application Server;.NET Core平台下可以选择IIS, Apache,Nginx 与ASP.NET Core构建。

1.4. 反向代理概念与基本原理

1.4.1. 反向代理基本概念

反向代理是代理服务器的一种。它根据客户端的请求,从后端的服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端。

与前向代理不同,前向代理作为一个媒介将互联网上获取的资源返回给相关联的客户端,而反向代理是在服务器端(如Web服务器)作为代理使用,而不是客户端。

客户端通过前向代理可以访问很多不同的资源,而反向代理是很多客户端都通过它访问不同后端服务器上的资源,而不需要知道这些后端服务器的存在,而以为所有资源都来自于这个反向代理服务器。


web服务器、应用服务器、web容器、反向代理服务器区别与联系


互联网中的请求发送给反向代理,反向代理把请求转发到内网中的服务器。

反向代理的主要作用为:

  1. 加密和SSL加速
  2. 负载均衡
  3. 缓存静态内容
  4. 压缩
  5. 减速上传
  6. 安全防火墙
  7. 外网发布
  8. 突破互联网封锁
  9. 解决跨域问题


1.4.2. 反向代理基本工作原理

一个反向代理服务器的构成和处理过程如下图:


web服务器、应用服务器、web容器、反向代理服务器区别与联系


左边淡黄色功能模块对外网报文进行处理,右边灰色功能模块针对内网报文进行处理

TCP监听模块

监听TCP请求,这里的请求是指报文内容是某应用层协议(比如HTTP,FTP,EMAIL等应用层协议)的请求。至于这里是否会单独产生一个线程来开始处理,这个由服务器自己决定,目前最流行的是先入消息队列然后异步处理,这样能极大提高代理的吞吐量和稳定性。

匹配被代理服务器

代理服务器根据一个表(存放外网url和内网服务器的对应关系,通常需人工进行设置),如果匹配到则继续处理,否则依据外网协议返回错误信息,比如HTTP协议这返回404。

应用负载均衡策略

如果比较大型的互联网应用,为了整体系统稳定性,解决单点问题,需要根据自定义策略合理的转发报文给被代理服务器。简单的策略是哈希分发或者随机分发,一般可以由用户进行配置和选择。

预处理

这里依据协商好的外网应用协议进行解密,安全,会话,解压等处理。

新生成网络报文

这里依据协商好的内网应用协议生成网络报文,这里可能会进行加密,安全,会话,压缩等处理。

转发给被代理服务器

把新生成的网络报文发送给内网服务器(可能是否Web服务器,Ftp服务器,邮件服务器)。

接受网络报文

接受内网服务器反馈的网络报文。

预处理

这里依据协商好的外网应用协议进行加密,安全,会话,压缩等处理。

资源输出模块

这时生成满足外网应用协议要求的报文,并发送到外网连接的另一端(用户代理)。

常用的反向代理服务器

它们的名字您一定记得:Ngnix,IIS,Apache。

1.5. 总结

从概念上讲:Web服务器是提供WWW服务的程序;Web容器是提供给开发者的框架;Web应用程序服务器内容丰富得多,既可用各厂商通常遵循一定的工业标准并自定义扩展功能而成,也可以利用开源组件轻量级拼装打造;

反向代理服务器在企业级应用中表现突出,具有解决集中式安全,负载均衡等等优点。如今这四个概念的边界越来模糊,看看这个表就知道了:


web服务器、应用服务器、web容器、反向代理服务器区别与联系



关于Kerstrel是否web容器,有两种观点:

  1. 由于Kerstrel不提供编写应用的框架,所以它不是容器;asp.net core才是容器,因为它提供了开发应用的框架并提供web应用(MVC,Web API)运行环境。
  2. Kerstrel提供了运行环境。


非常欢迎大家提出自己的有力观点,帮助我们清晰化这个asp.net core容器概念。

资料引用
https://en.wikipedia.org/wiki/Web_serverhttp://www.cnblogs.com/vipyoumay/p/5853694.htmlhttps://zh.wikipedia.org/wiki/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86


分享到:


相關文章: