作(zuò)者:程序君来源:Web编程开发
我们知道,不同肤色的人外貌差别很(hěn)大,而双胞胎的辨识很(hěn)难。有(yǒu)意思的是Web服務(wù)器/Web容器/Web应用(yòng)程序服務(wù)器/反向代理(lǐ)有(yǒu)点像四胞胎,在网络上经常一起出现。本文(wén)将带读者对这四个相似概念如何區(qū)分(fēn)。
一文(wén)看懂web服務(wù)器、应用(yòng)服務(wù)器、web容器、反向代理(lǐ)服務(wù)器區(qū)别与联系
Web服務(wù)器概念与基本原理(lǐ)
Web服務(wù)器的历史
Web服務(wù)器工(gōng)作(zuò)原理(lǐ)
Web应用(yòng)程序容器概念与基本原理(lǐ)
Web应用(yòng)程序容器的由来
Web应用(yòng)程序容器的基本工(gōng)作(zuò)原理(lǐ)
Web应用(yòng)程序服務(wù)器概念及基本原理(lǐ)
反向代理(lǐ)概念与基本原理(lǐ)
反向代理(lǐ)基本概念
反向代理(lǐ)基本工(gōng)作(zuò)原理(lǐ)
总结
Web服務(wù)器概念与基本原理(lǐ)
Web服務(wù)器的历史
1989年,互联网之父Berners-Lee向其雇主CERN提出了一个新(xīn)项目,目的是通过使用(yòng)超文(wén)本系统来缓解科(kē)學(xué)家之间的信息交流。该项目导致Berners-Lee在1990年编写了两个方案:
一个名(míng)為(wèi)WorldWideWeb的浏览器。
世界上第一个网络服務(wù)器,后来被称為(wèi)CERN httpd,它运行在NeXTSTEP上
在1991年至1994年期间,用(yòng)于通过万维网冲浪和交换数据的早期技(jì )术的简单性和有(yǒu)效性有(yǒu)助于将其移植到许多(duō)不同的操作(zuò)系统,并将其用(yòng)于科(kē)學(xué)组织和大學(xué),然后传播到行业。
1994年,Berners-Lee决定组建万维网联盟(W3C),通过标准化过程来管理(lǐ)涉及的许多(duō)技(jì )术(HTTP,HTML等)的进一步发展。
就是这台服務(wù)器:

Web服務(wù)器的主要功能(néng)是存储,处理(lǐ)和传递网页(yè)给客户。客户端和服務(wù)器之间的通信使用(yòng)超文(wén)本传输协议(HTTP)进行。交付的页(yè)面最常见的是HTML文(wén)档,除了文(wén)本内容之外,还可(kě)能(néng)包含图像,样式表和脚本。
一个用(yòng)户代理(lǐ),通常是web浏览器或web爬虫,通过发起一个HTTP请求以获取服務(wù)器资源,服務(wù)器根据请求返回该资源或由于某种原因响应错误消息。该资源通常是服務(wù)器辅助存储上的真实文(wén)件,但这不一定是这种情况,取决于Web服務(wù)器的实现方式。

虽然主要功能(néng)是提供内容,但HTTP的完整实现还包括从客户端接收内容的方式。此功能(néng)用(yòng)于提交Web表单,包括上传文(wén)件。许多(duō)通用(yòng)Web服務(wù)器还支持使用(yòng)Active Server Pages(ASP),PHP或其他(tā)脚本语言的服務(wù)器端脚本。这意味着Web服務(wù)器的行為(wèi)可(kě)以在单独的文(wén)件中(zhōng)脚本化,而实际的服務(wù)器软件保持不变。通常,此函数用(yòng)于动态生成HTML文(wén)档(“即时”),而不是返回静态文(wén)档。前者主要用(yòng)于从数据库检索或修改信息。后者通常快得多(duō),并且更容易被缓存,但不能(néng)提供动态内容。
Web服務(wù)器不仅用(yòng)于為(wèi)万维网服務(wù)。它们也可(kě)以被嵌入到诸如打印机,路由器,网络摄像机等设备中(zhōng),并且仅服務(wù)于本地网络。然后,web服務(wù)器可(kě)以用(yòng)作(zuò)用(yòng)于监视或管理(lǐ)所讨论的设备的系统的一部分(fēn)。这通常意味着客户端计算机上不需要安(ān)装(zhuāng)其他(tā)软件,因為(wèi)只需要一个网络浏览器(现在大多(duō)数操作(zuò)系统都包含在内)。
Web服務(wù)器工(gōng)作(zuò)原理(lǐ)
HTTP协议基于TCP协议上,是一个应用(yòng)层协议,用(yòng)于用(yòng)户代理(lǐ)和Web服務(wù)器进行通信。Web服務(wù)器通常采用(yòng)一问一答(dá)的方式进行工(gōng)作(zuò):
1、在用(yòng)户代理(lǐ)上用(yòng)户发起资源请求,请求内容包括但不限于:指定资源的唯一标识IRI,指明动作(zuò)类型(GET/POST/DELETE/PUT...)
2、用(yòng)户代理(lǐ)解析用(yòng)户输入IRI并从中(zhōng)获取目标域名(míng),交由DNS服務(wù)器解析。如果IRI中(zhōng)指定某IP地址,这无需这步。
3、如果与服務(wù)器的会话还没建立,此时先建立TCP连接,并完成HTTP协商(shāng)(确定双方均可(kě)接受的处理(lǐ)方式,包括协议版本,是否加密,内容格式等等)。
4、用(yòng)户代理(lǐ)把请求内容封装(zhuāng)成HTTP数据包向服務(wù)器发送。
5、服務(wù)器接收到资源请求并以之前协商(shāng)好的方式解包并处理(lǐ)。
6、服務(wù)器请求的资源封装(zhuāng)成HTTP数据包并返回给用(yòng)户代理(lǐ)。
接下来重点说说服務(wù)器端的工(gōng)作(zuò)原理(lǐ)

TCP监听模块
服務(wù)器监听某个端口(一般默认是8080端口,用(yòng)户可(kě)以设置其他(tā)端口),以建立和用(yòng)户代理(lǐ)之间的连接。一旦建立连接,用(yòng)户代理(lǐ)的后续HTTP请求将不用(yòng)再进入监听模块。
预处理(lǐ)
此处主要做三件事:1. 从TCP报文(wén)中(zhōng)获取HTTP请求报文(wén)。2. 根据和用(yòng)户代理(lǐ)的协商(shāng)进行解密,解压,安(ān)全处理(lǐ)等等。3. 根据服務(wù)器自身的配置进行安(ān)全处理(lǐ),建立会话状态等等。
UR路由
解析URL字符串和动作(zuò)以确定用(yòng)户代理(lǐ)请求的资源,根据匹配规则(通常根据正则表达式+后缀)路由到静态资源处理(lǐ)模块或动态资源处理(lǐ)模块。
静态资源处理(lǐ)模块
负责找到静态资源,比如HTML/Javascript/CSS文(wén)件/图片/图像,确定内容是字符流或者字节流,并确定对应MIME,比如HTML生成MIME為(wèi)text/html的字符流,mpeg视频文(wén)件生成MIME為(wèi)video/mpeg的字节流。
动态资源处理(lǐ)模块
运行业務(wù)逻辑处理(lǐ),动态决定返回的资源内容和类型,内容和类型的处理(lǐ)原则同上。
后处理(lǐ)
根据和用(yòng)户协商(shāng)的协议进行加密,压缩,安(ān)全处理(lǐ)等等。
资源输出模块
把处理(lǐ)好的内容和类型封装(zhuāng)成HTTP报文(wén),往TCP连接另一头的用(yòng)户代理(lǐ)发送TCP报文(wén)(内容是HTTP报文(wén))。
主流Web服務(wù)器
包括Apache、IIS 、Nginx,市场占有(yǒu)率如下
还有(yǒu)比较多(duō)使用(yòng)Tomcat,Jetty,WebSphere,WebLogic,Kerstrel等等。
Web应用(yòng)程序容器概念与基本原理(lǐ)
Web应用(yòng)程序容器的由来
Web服務(wù)器的出现的标志(zhì)着WWW时代的带来,世界变得更加平面化。当初尝到甜头的开创者们开始不满足与在互联网上获取静态资源,于是出现了CGI脚本来动态获取资源。再后来网络发展方向也是朝着增强Web服務(wù)器动态获取资源的能(néng)力前进。以下是代表性的动态技(jì )术:

随后Web服務(wù)器朝着企业级应用(yòng)方向发展,快速的业務(wù)变化,迫使Web开发人员面对新(xīn)的挑战:如何快速写出鲁棒,可(kě)靠,符合业務(wù)需求的程序并顺利部署?解决这个挑战的一个有(yǒu)效的办(bàn)法是,创造一个Web程序开发框架(含运行环境,比如解释执行JSP,Web API),这个框架解决鲁棒性,可(kě)靠性问题,提供快速开发接口。换言之,开发人员只需要专注于实现业務(wù)本身,如有(yǒu)更高的需求还可(kě)以对框架进行定制和扩展。这个框架的另外一个名(míng)字是Web应用(yòng)程序容器。
Web应用(yòng)程序容器的基本工(gōng)作(zuò)原理(lǐ)
一般情况下Web应用(yòng)程序容器是以下构成體(tǐ)系:

注:浅蓝色的模块是实现业務(wù)程序的主要使用(yòng)模块。
相对于Web服務(wù)器,该容器新(xīn)增或强化了以下模块:
分(fēn)配線(xiàn)程池资源
容器為(wèi)每个请求分(fēn)配一个線(xiàn)程进行处理(lǐ),通常采取線(xiàn)程池的方式高效理(lǐ)由CPU算资源。
封装(zhuāng)Request上下文(wén)
一个请求对应一个Request上下文(wén),它主要封装(zhuāng)了用(yòng)户请求的主要构成:URL,HTTP请求头,以及基于请求头构建的Session,Cookie等对象,方便编程使用(yòng)。
封装(zhuāng)Response上下文(wén)
一个请求对应一个Response上下文(wén),主要用(yòng)于向用(yòng)户代理(lǐ)返回资源。可(kě)以在其中(zhōng)写入输出流,或者重定向,或者返回错误码等等。
URL路由
在容器里,运行开发人员设置不同的路由匹配规则,比如让.HTM返回.HTML,也可(kě)以自定义.xyz返回.HTML资源。更加灵活的配置可(kě)以参考JAVA MVC或者ASP.NET MVC的配置方案。
动态资源处理(lǐ)模块
通常在这里具(jù)體(tǐ)的容器和开发语言都有(yǒu)自己的高效开发模型,比如JAVA的Servlet,ASP.NET的Web Form,MVC。
回收资源
这里会回收刚才的線(xiàn)程资源,為(wèi)了線(xiàn)程复用(yòng),除非服務(wù)器空闲一般会将線(xiàn)程返回線(xiàn)程池。
可(kě)以看出,Web容器本身具(jù)备了做為(wèi)一个Web服務(wù)器的功能(néng),事实上通常实现Web容器功能(néng)的服務(wù)器就是一个Web服務(wù)器.比如Tomcat , IIS ,Jetty。
主流Web容器
包括Tomcat , IIS ,Jetty 。
还有(yǒu)比较多(duō)使用(yòng)WebSphere,WebLogic等等。
Web应用(yòng)程序服務(wù)器概念及基本原理(lǐ)
在Web服務(wù)器发展的同一个时期,应用(yòng)服務(wù)器已经存在并发展很(hěn)長(cháng)一段时间了。一些公(gōng)司為(wèi)Unix开发了Tuxedo(面向事務(wù)的中(zhōng)间件)、TopEnd、Encina等产(chǎn)品,这些产(chǎn)品都是从类似IMS和CICS的主机应用(yòng)管理(lǐ)和监控环境衍生而来的。大部分(fēn)的这些产(chǎn)品都指定了“封闭的”产(chǎn)品专用(yòng)通信协议来互连胖客户机(“fat” client)和服務(wù)器。在90年代,这些传统的应用(yòng)服務(wù)器产(chǎn)品开始嵌入HTTP通信功能(néng),刚开始要利用(yòng)网关来实现。不久后它们之间的界線(xiàn)开始变得模糊了。
同时,web服務(wù)器越来越成熟,可(kě)以处理(lǐ)更高的负载、更多(duō)的并发和拥有(yǒu)更好的特性;应用(yòng)服務(wù)器开始添加越来越多(duō)的基于HTTP的通信功能(néng)。所有(yǒu)的这些导致了web服務(wù)器与应用(yòng)服務(wù)器的界線(xiàn)变得更窄了。
目前,“应用(yòng)服務(wù)器”和“web服務(wù)器”之间的界線(xiàn)已经变得模糊不清了。但是人们还把这两个术语區(qū)分(fēn)开来,作(zuò)為(wèi)强调使用(yòng)。
当有(yǒu)人说到“web服務(wù)器”时,你通常要把它认為(wèi)是以HTTP為(wèi)核心、web UI為(wèi)向导的应用(yòng)。当有(yǒu)人说到“应用(yòng)服務(wù)器”时,你可(kě)能(néng)想到“高负载、企业级特性、事務(wù)和队列、多(duō)通道通信(HTTP和更多(duō)的协议)”。但现在提供这些需求的基本上都是同一个产(chǎn)品。
下图描述一个典型的Web应用(yòng)服務(wù)器的结构图:

从上图中(zhōng)可(kě)以看到Web应用(yòng)服務(wù)器包括了Web容器,同时内置了支撑企业应用(yòng)的事務(wù),安(ān)全,集成,通信,高可(kě)用(yòng)等等功能(néng),极大了减少了重复开发量,保障了业務(wù)系统快速开发和部署,而它本身也是一个Web服務(wù)器。Web应用(yòng)服務(wù)器可(kě)以选择使用(yòng)大厂的WebLogic和WebSphere这种重量级产(chǎn)品外,也可(kě)以使用(yòng)类似与Tomcat、jetty这样的web containner 再加上第三方的框架(spring,hibernate等)来构建自己的Application Server;.NET Core平台下可(kě)以选择IIS, Apache,Nginx 与ASP.NET Core构建。
反向代理(lǐ)概念与基本原理(lǐ)
反向代理(lǐ)基本概念
反向代理(lǐ)是代理(lǐ)服務(wù)器的一种。它根据客户端的请求,从后端的服務(wù)器(如Web服務(wù)器)上获取资源,然后再将这些资源返回给客户端。与前向代理(lǐ)不同,前向代理(lǐ)作(zuò)為(wèi)一个媒介将互联网上获取的资源返回给相关联的客户端,而反向代理(lǐ)是在服務(wù)器端(如Web服務(wù)器)作(zuò)為(wèi)代理(lǐ)使用(yòng),而不是客户端。客户端通过前向代理(lǐ)可(kě)以访问很(hěn)多(duō)不同的资源,而反向代理(lǐ)是很(hěn)多(duō)客户端都通过它访问不同后端服務(wù)器上的资源,而不需要知道这些后端服務(wù)器的存在,而以為(wèi)所有(yǒu)资源都来自于这个反向代理(lǐ)服務(wù)器。

互联网中(zhōng)的请求发送给反向代理(lǐ),反向代理(lǐ)把请求转发到内网中(zhōng)的服務(wù)器。
反向代理(lǐ)基本工(gōng)作(zuò)原理(lǐ)
一个反向代理(lǐ)服務(wù)器的构成和处理(lǐ)过程如下图:

左边淡黄色功能(néng)模块对外网报文(wén)进行处理(lǐ),右边灰色功能(néng)模块针对内网报文(wén)进行处理(lǐ)
TCP监听模块
监听TCP请求,这里的请求是指报文(wén)内容是某应用(yòng)层协议(比如HTTP,FTP,EMAIL等应用(yòng)层协议)的请求。至于这里是否会单独产(chǎn)生一个線(xiàn)程来开始处理(lǐ),这个由服務(wù)器自己决定,目前最流行的是先入消息队列然后异步处理(lǐ),这样能(néng)极大提高代理(lǐ)的吞吐量和稳定性。
匹配被代理(lǐ)服務(wù)器
代理(lǐ)服務(wù)器根据一个表(存放外网url和内网服務(wù)器的对应关系,通常需人工(gōng)进行设置),如果匹配到则继续处理(lǐ),否则依据外网协议返回错误信息,比如HTTP协议这返回404。
应用(yòng)负载均衡策略
如果比较大型的互联网应用(yòng),為(wèi)了整體(tǐ)系统稳定性,解决单点问题,需要根据自定义策略合理(lǐ)的转发报文(wén)给被代理(lǐ)服務(wù)器。简单的策略是哈希分(fēn)发或者随机分(fēn)发,一般可(kě)以由用(yòng)户进行配置和选择。
预处理(lǐ)
这里依据协商(shāng)好的外网应用(yòng)协议进行解密,安(ān)全,会话,解压等处理(lǐ)。
新(xīn)生成网络报文(wén)
这里依据协商(shāng)好的内网应用(yòng)协议生成网络报文(wén),这里可(kě)能(néng)会进行加密,安(ān)全,会话,压缩等处理(lǐ)。
转发给被代理(lǐ)服務(wù)器
把新(xīn)生成的网络报文(wén)发送给内网服務(wù)器(可(kě)能(néng)是否Web服務(wù)器,Ftp服務(wù)器,邮件服務(wù)器)。
接受网络报文(wén)
接受内网服務(wù)器反馈的网络报文(wén)。
预处理(lǐ)
这里依据协商(shāng)好的外网应用(yòng)协议进行加密,安(ān)全,会话,压缩等处理(lǐ)。
资源输出模块
这时生成满足外网应用(yòng)协议要求的报文(wén),并发送到外网连接的另一端(用(yòng)户代理(lǐ))。
常用(yòng)的反向代理(lǐ)服務(wù)器
它们的名(míng)字您一定记得:Ngnix,IIS,Apache。
总结
从概念上讲:Web服務(wù)器是提供WWW服務(wù)的程序;Web容器是提供给开发者的框架;Web应用(yòng)程序服務(wù)器内容丰富得多(duō),既可(kě)用(yòng)各厂商(shāng)通常遵循一定的工(gōng)业标准并自定义扩展功能(néng)而成,也可(kě)以利用(yòng)开源组件轻量级拼装(zhuāng)打造;反向代理(lǐ)服務(wù)器在企业级应用(yòng)中(zhōng)表现突出,具(jù)有(yǒu)解决集中(zhōng)式安(ān)全,负载均衡等等优点。如今这四个概念的边界越来模糊,看看这个表就知道了:
软件名(míng)词
是否Web服務(wù)器
是否Web容器
是否Web应用(yòng)服務(wù)器
是否能(néng)反向代理(lǐ)

关于Kerstrel是否web容器,有(yǒu)两种观点:
1. 由于Kerstrel不提供编写应用(yòng)的框架,所以它不是容器;asp.net core才是容器,因為(wèi)它提供了开发应用(yòng)的框架并提供web应用(yòng)(MVC,Web API)运行环境。
2. Kerstrel提供了运行环境。
非常欢迎大家提出自己的有(yǒu)力观点,帮助我们清晰化这个asp.net core容器概念。
声明:本网站发布的内容(图片、视频和文(wén)字)以原创、转载和分(fēn)享网络内容為(wèi)主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文(wén)章观点不代表本网站立场,如需处理(lǐ)请联系客服,電(diàn)话:0755-22671324。