我们知道,不同肤色的人看起来差别很大,很难区分双胞胎。有趣的是,Web 服务器/Web 容器/Web 应用服务器/反向代理有点像四胞胎,经常一起出现在互联网上。本文将向读者展示如何区分这四个相似的概念。
1. 一篇文章了解Web服务器、应用服务器、Web容器、反向代理服务器的区别和联系
1.1. Web服务器概念和基本原理
1.1.1. Web 服务器的历史
1989 年,互联网之父伯纳斯-李向其雇主欧洲核子研究中心提出了一个新项目,旨在通过使用超文本系统方便科学家之间的信息交流。该项目促使伯纳斯-李于 1990 年编写了两个程序:
1994 年,伯纳斯-李决定组建万维网联盟(W3C),通过标准化流程管理所涉及的诸多技术(HTTP、HTML 等)的进一步发展。
这是服务器:
网络服务器的主要功能是存储、处理和向客户端提供网页。客户端和服务器之间的通信使用超文本传输协议 (HTTP) 进行。所传递的页面最常见的是 HTML 文档,除了文本内容外,还可能包含图像、样式表和脚本。
用户代理(通常是 Web 浏览器或 Web 爬虫)发出 HTTP 请求以获取服务器资源,服务器根据请求返回资源或因某种原因响应错误消息。资源通常是服务器辅助存储上的真实文件,但情况不一定如此,具体取决于 Web 服务器的实现方式。
虽然主要功能是提供内容,但 HTTP 的完整实现还包括一种从客户端接收内容的方法。此功能用于提交 Web 表单,包括上传文件。许多常见的 Web 服务器还支持使用 Active Server Pages (ASP)、PHP 或其他脚本语言进行服务器端脚本编写。这意味着 Web 服务器的行为可以在单独的文件中编写脚本,而实际的服务器软件保持不变。通常,此功能用于动态(“即时”)生成 HTML 文档,而不是返回静态文档。前者主要用于从数据库检索或修改信息。后者通常速度更快,更容易缓存web代理服务器软件,但不能提供动态内容。
Web 服务器不仅用于服务万维网。它们还可以嵌入到打印机、路由器、网络摄像头等设备中,仅服务于本地网络。然后web代理服务器软件,Web 服务器可以用作监控或管理相关设备的系统的一部分。这通常意味着客户端计算机上不需要安装其他软件,因为只需要一个 Web 浏览器(如今大多数操作系统都附带该浏览器)。
1.1.2. Web 服务器如何工作
HTTP 是基于 TCP 的应用层协议,用于用户代理和 Web 服务器之间的通信。Web 服务器通常以问答方式工作:
1、用户在用户代理上发起资源请求,请求内容包括但不限于:指定资源唯一标识IRI、指明动作类型(GET/POST/DELETE/PUT…)
2. 用户代理解析用户输入的IRI,从中获取目标域名,然后由DNS服务器进行解析。如果IRI中指定了IP地址,则此步骤无需执行。
3、如果与服务器的会话还未建立,则先建立TCP连接,完成HTTP协商(确定双方都能接受的处理方式,包括协议版本,加密,内容格式等)。
4、用户代理将请求内容封装成HTTP数据包发送给服务器。
5.服务器收到资源请求,按照之前协商好的方式解包并处理。
6.服务器将请求的资源封装成HTTP数据包返回给用户代理。
接下来我们来关注一下服务器的工作原理。
服务器监听某个端口(通常默认为8080,但用户可以设置其他端口)与用户代理建立连接,一旦连接建立,后续来自用户代理的HTTP请求就不再需要进入监听模块。
这里主要做了三件事:1.从TCP报文中获取HTTP请求报文。2.根据与用户代理的协商结果进行解密、解压缩以及进行安全处理。3.根据服务器自身的配置进行安全处理,建立会话状态等。
解析URL字符串和action,确定用户代理请求的资源,并根据匹配规则(通常基于正则表达式+后缀)路由到静态资源处理模块或者动态资源处理模块。
负责查找静态资源,如HTML/Javascript/CSS文件/图片/images等,判断内容是字符流还是字节流,并确定对应的MIME。例如HTML生成字符流的MIME为text/html,mpeg视频文件生成字节流的MIME为video/mpeg。
运行业务逻辑处理,动态判断返回资源的内容和类型,内容和类型的处理原理同上。
根据与用户协商的协议进行加密、压缩、安全处理等。
将处理后的内容和类型封装成HTTP消息,并将该TCP消息(内容为HTTP消息)发送给TCP连接另一端的用户代理。
主流 Web 服务器
包括 Apache、IIS、Nginx 在内的市场份额如下
比较常用的还有Tomcat、Jetty、WebSphere、WebLogic、Kerstrel等。
1.2. Web应用容器概念及基本原理
1.2.1. Web 应用容器的起源
Web 服务器的出现标志着 WWW 时代的到来,世界变得更加扁平。当初尝到甜头的先行者们开始不满足于网络上静态获取资源,于是出现了 CGI 脚本来动态获取资源。后来网络的发展方向也是增强 Web 服务器动态获取资源的能力。以下是具有代表性的动态技术:
专业术语特点
CGI(通用网关接口)
作为独立进程运行,可以使用多种语言开发,如C、C++、VB、Perl等,灵活但效率低、维护复杂。
PHP
服务端内嵌HTML脚本,开源,功能强大,扩展性差
JSP
服务端内嵌HTML脚本,跨平台,部署前需要编译,主要缺点是编写JSP相对复杂,需要熟悉JAVA及相关技术。
服务供应商
服务器端内嵌HTML脚本,开发简单,功能强大,但只能在Windows下运行。
随后,Web 服务器向企业级应用方向发展。业务的快速变化迫使 Web 开发人员面临新的挑战:如何快速编写出符合业务需求的健壮、可靠程序并顺利部署?解决这一挑战的一个有效途径就是创建一个 Web 程序开发框架(包括运行环境,如解释执行 JSP、Web API)。这个框架解决了健壮性和可靠性问题,并提供了快速开发接口,也就是说开发人员只需要关注业务本身的实现,如果有更高的要求,可以对框架进行定制和扩展。这个框架的另一个名字叫作 Web 应用容器。
1.2.2. Web应用容器基本工作原理
一般来说,一个Web应用程序容器由以下部分组成:
注:浅蓝色模块为用来实现业务程序的主要模块。
与Web服务器相比,容器增加或增强了以下模块:
容器分配一个线程来处理每个请求,通常使用线程池来高效利用CPU资源。
一次请求对应一个Request上下文,其中主要封装了用户请求的主要组成部分:URL、HTTP请求头以及基于请求头构建的Session、cookie等对象,方便编程。
一个 request 对应一个 Response 上下文,主要用于返回资源给用户代理,可以编写输出流、重定向、返回错误码等。
在容器中,开发者可以设置不同的路由匹配规则,比如让.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 服务器开发的同一时期,应用服务器已经存在并发展了很长一段时间。公司开发了 Tuxedo(面向事务的中间件)、TopEnd 和 Encina for Unix 等产品,所有这些产品都源自大型机应用程序管理和监控环境,例如 IMS 和 CICS。大多数这些产品都指定了“封闭的”产品特定通信协议来互连“胖”客户端和服务器。在 20 世纪 90 年代,这些传统的应用服务器产品开始嵌入 HTTP 通信功能,最初使用网关。很快,它们之间的界限开始变得模糊。
与此同时,Web 服务器也日趋成熟,能够处理更高的负载、更大的并发量和更完善的功能;应用服务器也开始加入越来越多基于 HTTP 的通信功能,这一切导致 Web 服务器和应用服务器之间的界限越来越窄。
如今,“应用服务器”和“Web服务器”之间的界限已经变得模糊,但人们仍然会区分这两个术语以便强调。
当有人说“Web 服务器”时,你通常会想到它是一个以 HTTP 为核心、以 Web UI 为指导的应用程序。当有人说“应用服务器”时,你可能会想到“高负载、企业级功能、事务和队列、多通道通信(HTTP 和更多协议)”。但现在提供这些要求的产品基本上是同一种产品。
下图描述了一个典型的Web应用服务器的结构:
从上图中我们可以看到Web应用服务器包含一个Web容器,内置了支持企业应用的事务、安全、集成、通信、高可用等功能,大大减少了重复开发量,保证了业务系统的快速开发和部署。其本身也是一个Web服务器。Web应用服务器可以选择使用大厂的WebLogic、WebSphere等重量级产品,也可以使用Tomcat、Jetty等Web容器加上第三方框架(spring、hibernate等)来搭建自己的应用服务器;在.NET Core平台下,可以选择IIS、Apache、Nginx、ASP.NET Core来搭建。
1.4. 反向代理概念和基本原理
1.4.1. 反向代理的基本概念
反向代理是代理服务器的一种,它根据客户端的请求从后端服务器(比如 Web 服务器)获取资源,然后将这些资源返回给客户端。与正向代理作为媒介将从互联网上获取的资源返回给关联的客户端不同,反向代理是作为服务器端(比如 Web 服务器)的代理,而不是客户端。客户端可以通过正向代理访问许多不同的资源,而反向代理是许多客户端在不知道这些后端服务器的存在的情况下访问不同后端服务器上的资源,并认为所有资源都来自这个反向代理服务器。
来自互联网的请求被发送到反向代理,反向代理将请求转发到内网中的服务器。
反向代理的主要功能是:
1.4.2. 反向代理的基本工作原理
反向代理服务器的组成及处理如下:
左侧黄色功能模块处理外网报文,右侧灰色功能模块处理内网报文。
监听TCP请求,这里的请求是针对某种应用层协议(如HTTP、FTP、EMAIL等)的请求。是否会产生单独的线程来启动处理由服务器自己决定。目前最流行的方法是先进入消息队列,然后异步处理,这样可以大大提高代理的吞吐量和稳定性。
代理服务器通过一个表(这个表保存了外网URL和内网服务器的对应关系,通常需要手动设置)找到匹配的,则继续处理,否则根据外网协议返回错误信息,比如HTTP协议返回404。
如果是大型互联网应用,为了保证系统整体稳定性,解决单点问题,需要按照自定义的策略,合理地将消息转发到被代理的服务器上,简单的策略有hash分布或者随机分布,一般可以由用户自行配置选择。
这里根据协商好的外网应用协议进行解密、安全、会话、解压等处理。
在这里根据协商好的内网应用协议生成网络报文,并可能在这里进行加密、安全、会话、压缩等处理。
将新生成的网络报文发送到内网服务器(可能是Web服务器,Ftp服务器,邮件服务器)。