一文看懂Web服务器、应用服务器、Web容器、反向代理服务器区别与联系

咱们知道,不一样肤色的人外貌差异很大,而双胞胎的辨识很难。有意思的是Web服务器/Web容器/Web应用程序服务器/反向代理有点像四胞胎,在网络上常常一块儿出现。本文将带读者对这四个类似概念如何区分。html

一,Web服务器概念与基本原理

1.1 Web服务器的历史

1989年,互联网之父Berners-Lee向其雇主CERN提出了一个新项目,目的是经过使用超文本系统来缓解科学家之间的信息交流。该项目致使Berners-Lee在1990年编写了两个方案:web

一个名为WorldWideWeb的浏览器。正则表达式

世界上第一个网络服务器,后来被称为CERN httpd,它运行在NeXTSTEP上spring

在1991年至1994年期间,用于经过万维网冲浪和交换数据的早期技术的简单性和有效性有助于将其移植到许多不一样的操做系统,并将其用于科学组织和大学,而后传播到行业。数据库

1994年,Berners-Lee决定组建万维网联盟(W3C),经过标准化过程来管理涉及的许多技术(HTTP,HTML等)的进一步发展。编程

就是这台服务器:windows

d95c3f689dbb8fd7c38713e5fb7bf3be.jpeg

Web服务器的主要功能是存储,处理和传递网页给客户。客户端和服务器之间的通讯使用超文本传输协议(HTTP)进行。交付的页面最多见的是HTML文档,除了文本内容以外,还可能包含图像,样式表和脚本。后端

一个用户代理,一般是web浏览器或web爬虫,经过发起一个HTTP请求以获取服务器资源,服务器根据请求返回该资源或因为某种缘由响应错误消息。该资源一般是服务器辅助存储上的真实文件,但这不必定是这种状况,取决于Web服务器的实现方式。跨域

ce802d1d3b4bfdb6cfb343016c9f4db7.jpeg

虽然主要功能是提供内容,但HTTP的完整实现还包括从客户端接收内容的方式。此功能用于提交Web表单,包括上传文件。浏览器

许多通用Web服务器还支持使用Active Server Pages(ASP),PHP或其余脚本语言的服务器端脚本。这意味着Web服务器的行为能够在单独的文件中脚本化,而实际的服务器软件保持不变。

一般,此函数用于动态生成HTML文档(“即时”),而不是返回静态文档。前者主要用于从数据库检索或修改信息。后者一般快得多,而且更容易被缓存,但不能提供动态内容。

Web服务器不只用于为万维网服务。它们也能够被嵌入到诸如打印机,路由器,网络摄像机等设备中,而且仅服务于本地网络。而后,web服务器能够用做用于监视或管理所讨论的设备的系统的一部分。

这一般意味着客户端计算机上不须要安装其余软件,由于只须要一个网络浏览器(如今大多数操做系统都包含在内)。

1.2 Web服务器工做原理

HTTP协议基于TCP协议上,是一个应用层协议,用于用户代理和Web服务器进行通讯。Web服务器一般采用一问一答的方式进行工做:

  • 一、在用户代理上用户发起资源请求,请求内容包括但不限于:指定资源的惟一标识IRI,指明动做类型(GET/POST/DELETE/PUT…)

  • 二、用户代理解析用户输入IRI并从中获取目标域名,交由DNS服务器解析。若是IRI中指定某IP地址,这无需这步。

  • 三、若是与服务器的会话还没创建,此时先创建TCP链接,并完成HTTP协商(肯定双方都可接受的处理方式,包括协议版本,是否加密,内容格式等等)。

  • 四、用户代理把请求内容封装成HTTP数据包向服务器发送。

  • 五、服务器接收到资源请求并以以前协商好的方式解包并处理。

  • 六、服务器请求的资源封装成HTTP数据包并返回给用户代理。

接下来重点说说服务器端的工做原理

b1ec3beaa7d32216a59af829ac76248c.png

  • TCP监听模块
    服务器监听某个端口(通常默认是8080端口,用户能够设置其余端口),以创建和用户代理之间的链接。一旦创建链接,用户代理的后续HTTP请求将不用再进入监听模块。

  • 预处理
    此处主要作三件事:1. 从TCP报文中获取HTTP请求报文。 2. 根据和用户代理的协商进行解密,解压,安全处理等等。3. 根据服务器自身的配置进行安全处理,创建会话状态等等。

  • URL路由
    解析URL字符串和动做以肯定用户代理请求的资源,根据匹配规则(一般根据正则表达式+后缀)路由到静态资源处理模块或动态资源处理模块。

  • 静态资源处理模块
    负责找到静态资源,好比HTML/Javascript/CSS文件/图片/图像,肯定内容是字符流或者字节流,并肯定对应MIME,好比HTML生成MIME为text/html的字符流,mpeg视频文件生成MIME为video/mpeg的字节流。

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

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

  • 资源输出模块
    把处理好的内容和类型封装成HTTP报文,往TCP链接另外一头的用户代理发送TCP报文(内容是HTTP报文)。

主流Web服务器

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

e3b6a7eb2cf025bfab22cff20730fd6b.jpeg

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

二,Web应用程序容器概念与基本原理

2.1 Web应用程序容器的由来

Web服务器的出现的标志着WWW时代的带来,世界变得更加平面化。当初尝到甜头的开创者们开始不知足与在互联网上获取静态资源,因而出现了CGI脚原本动态获取资源。

再后来网络发展方向也是朝着加强Web服务器动态获取资源的能力前进。如下是表明性的动态技术:

技术名词 特色
CGI(Common Gateway Interface,公用网关接口) 以独立进程运行,能够用多种语言开发,好比C,C++,VB,Perl,灵活但效率低,维护复杂
PHP 服务器端嵌入HTML脚本,开源,功能强大,扩展性较差
JSP 服务器端嵌入HTML脚本,跨平台,部署前需编译,主要缺点是编写JSP比较复杂,需熟悉JAVA及相关技术
ASP 服务器端嵌入HTML脚本,开发简单,功能强大,只能在windows下运行

随后Web服务器朝着企业级应用方向发展,快速的业务变化,迫使Web开发人员面对新的挑战:如何快速写出鲁棒,可靠,符合业务需求的程序并顺利部署?

解决这个挑战的一个有效的办法是,创造一个Web程序开发框架(含运行环境,好比解释执行JSP,Web API),这个框架解决鲁棒性,可靠性问题,提供快速开发接口。

换言之,开发人员只须要专一于实现业务自己,若有更高的需求还能够对框架进行定制和扩展。这个框架的另一个名字是Web应用程序容器。

2.2 Web应用程序容器的基本工做原理

通常状况下Web应用程序容器是如下构成体系:

6a4195dcefb048730b3957af48f137b0.jpeg

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

相对于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等等。

三,Web应用程序服务器概念及基本原理

在Web服务器发展的同一个时期,应用服务器已经存在并发展很长一段时间了。一些公司为Unix开发了Tuxedo(面向事务的中间件)、TopEnd、Encina等产品,这些产品都是从相似IMS和CICS的主机应用管理和监控环境衍生而来的。

大部分的这些产品都指定了“封闭的”产品专用通讯协议来互连胖客户机(“fat” client)和服务器。在90年代,这些传统的应用服务器产品开始嵌入HTTP通讯功能,刚开始要利用网关来实现。不久后它们之间的界线开始变得模糊了。

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

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

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

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

3fa489456f9cc77d24b227a76813050b.jpeg

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

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

四,反向代理概念与基本原理

4.1 反向代理基本概念

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

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

客户端经过前向代理能够访问不少不一样的资源,而反向代理是不少客户端都经过它访问不一样后端服务器上的资源,而不须要知道这些后端服务器的存在,而觉得全部资源都来自于这个反向代理服务器。

35ef05ed803181a0f62ecfb743c34427.jpeg

互联网中的请求发送给反向代理,反向代理把请求转发到内网中的服务器。
反向代理的主要做用为:

  • 加密和SSL加速

  • 负载均衡

  • 缓存静态内容

  • 压缩

  • 减速上传

  • 安全防火墙

  • 外网发布

  • 突破互联网封锁

  • 解决跨域问题

4.2 反向代理基本工做原理

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


b5493bb0af7b39665cfe91b407e43189.jpeg

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

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

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

  • 应用负载均衡策略
    若是比较大型的互联网应用,为了总体系统稳定性,解决单点问题,须要根据自定义策略合理的转发报文给被代理服务器。简单的策略是哈希分发或者随机分发,通常能够由用户进行配置和选择。

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

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

  • 转发给被代理服务器
    把新生成的网络报文发送给内网服务器(多是否Web服务器,Ftp服务器,邮件服务器)。

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

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

  • 资源输出模块
    这时生成知足外网应用协议要求的报文,并发送到外网链接的另外一端(用户代理)。

经常使用的反向代理服务器

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

五,总结

从概念上讲:Web服务器是提供WWW服务的程序;Web容器是提供给开发者的框架;Web应用程序服务器内容丰富得多,既可用各厂商一般遵循必定的工业标准并自定义扩展功能而成,也能够利用开源组件轻量级拼装打造;反向代理服务器在企业级应用中表现突出,具备解决集中式安全,负载均衡等等优势。

现在这四个概念的边界越来模糊,看看这个表就知道了:

软件名词 是否Web服务器 是否Web容器 是否Web应用服务器 是否能反向代理
IIS
Nginx

Apache

Tomcat

Jetty

WebSphere
WebLogic
Kerstrel 是?

Http.sys



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

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

  2. Kerstrel提供了运行环境。

很是欢迎你们提出本身的有力观点,帮助咱们清晰化这个asp.net core容器概念。

资料引用
【1】https://en.wikipedia.org/wiki/Web_server
【2】http://www.cnblogs.com/vipyoumay/p/5853694.html
【3】https://zh.wikipedia.org/wiki/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86

本文转载自公众号【21CTO】原文:http://www.cnblogs.com/vipyoumay/p/7455431.html

相关文章
相关标签/搜索