web服务器、容器、中间件、反向代理、框架及相关组件介绍

在做web安全的过程中,经常遇到各种语言的web服务器、框架、容器、组件等等,很多时候这些东西我们都没有实际使用过(我之前基本都是[apache/nginx] + [django/flask] + python),对于java web及相关的组件不是很了解,但java系列公司都在用且高危漏洞都很多,借此机会刚好理清楚。

本文涉及web相关组件的类别为:

  • web服务器
  • 应用服务器
  • CGI
  • web容器
  • 反向代理服务器
  • 中间件
  • web框架

web服务器 & CGI & 应用服务器

在最初的HTTP1.0阶段,超链接出现,网页内容还属于初期,web服务器的概念被逐渐提出,当时的web服务器主要是通过HTTP协议传输静态页面内容和图片,当时的HTTP 1.0其实只是一种文件传输的方式。渐渐的,由于不满足于静态内容,无法针对不同的请求提供不同的服务,HTTP逐渐提供的CGI功能。

CGI—— COMMON GATEWAY INTERFACE 是用来针对不同的请求提供不同的内容,即动态内容。CGI是一种处理动态内容的标准,你可以使用任意的语言去实现。CGI协议允许我们添加任意的程序和服务。它是我们标准编程语言与web服务器之间的接口(当然,一般我们CGI与后端编程语言是一致的)。当用户通过浏览器访问内容时,其会传输CGI script name和数据到服务器上,然后服务器会调用CGI脚本去解析生成动态内容,最后由web服务器返回给用户。

应用服务器最初是一些专用产品使用专用的通信协议进行互联,由于HTTP协议的引用及web服务器更高的负载、更多的并发和拥有更好的特性,应用服务器逐渐和web服务器趋于一致。

但如果有区分时,web服务器往往指的是以HTTP为核心、web UI为向导的应用。而应用服务器,指高负载、企业级特性、事务和队列、多通道通信(HTTP和更多的协议的产品,但往往应用服务器这些特性web服务器也可能完成。

web-server

web服务器通常响应静态页面或图片的请求,进行页面跳转,然后把动态请求委托给其他程序(它的扩展、某种语言的解释引擎、Web容器)

常见的web服务器: IIS、Apache、Nginx、Lighttpd
常见的应用服务器: Tomcat,WebLogic,WebSphere,Jboss

容器 & web容器

容器作为操作系统和应用程序之间的桥梁,给处于其中的应用程序组件提供一个环境,使应用程序直接跟容器中的环境变量交互,不必关注其它系统问题。

而web容器顾名思义是处理http的容器。

简单的说,web容器是对web服务器的增强与封装(容器与应用服务器同理),他将原始的request解码 ---> 静态/动态处理模块结构进行了封装,变成了request解码 ---> request封装 ---> 生成response上下文 ---> URL路由 ---> 静态/动态处理(管理)方式,对于请求的抽象与动态处理的管理更加高级与去耦合,还根据每个请求分配一个线程等等,使得我们更好的去关注逻辑本身而非流程处理。

举个栗子,servlet可以理解服务器端处理数据的java小程序,针对不同的请求,我们有不同的servlet去实现相应的逻辑,而web容器就是管理所有servlet的东西,它帮我们定位、调用、结束需要的servlet

有些服务器中集成了容器:

Tomcat(拥有JSP容器,servlet容器) 、 Jboss(拥有EJB容器)、 IIS(拥有ASP容器)

IIS,Tomcat,WebLogic,WebSphere即是应用服务器,又拥有web服务器的功能。tomcat可以单独运行也可以被集成到Apache中,Apache处理静态文件比Tomcat快。

web container

中间件

中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源,中间件位于客户机服务器的操作系统之上,管理计算资源和网络通信,也可以定义为网络环境下处于操作系统、数据库等系统软件和应用软件之间的一种起连接作用的分布式软件,主要解决异构网络环境下分布式应用软件的互连与互操作问题,提供标准接口、协议,屏蔽实现细节,提高应用系统易移植性。

在Java web开发的演进与进化中,我们对于消息系统,数据库,服务化接口的抽象等,涉及数据分离的过程中,在分离过程中,就会涉及到分离后系统间,数据库间的交互。java中间件就是处理我们数据间交互,连接数据分离后两个系统间的通信,中间件不属于任何一个开发项目,就是让我们对应系统间或者数据库间数据流通无感知。有点像Linux下的管道。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
上面说到java是数据间的中间件,在java web开发中适用的范围主要应该是下面三个领域:
远程过程调用和对象访问中间件
主要解决分布式环境下应用的互相访问问题,这也是支撑应用服务化功能的基础;
例如:RPC:Remote Process Call(远程过程调用中间件)
消息中间件:解决应用之间的消息传递、解耦、异步的问题。
例如:ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。
ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。
数据访问中间件
主要解决应用访问数据库的共性问题的组件
例如:数据访问中间间就是我们使用数据库指定的数据驱动,例如:ODBC JDBC,以 JDBC 为例,
数据库本地维护了一个数据访问中间件,我们在访问数据库的时候,配置的地址其实是直接连接到JDBC这个数据访问中间件,
如果我们执行查询数据,或者对数据库的操作都是通过JDBC来连接数据库,然后通过JDBC查询完成数据库以后再返回给我们应用程序。作为中间件,查询过程对于我们是不可知的。

反向代理

反向代理是代理服务器的一种。它根据客户端的请求,从后端的服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端。与前向代理不同,前向代理作为一个媒介将互联网上获取的资源返回给相关联的客户端,而反向代理是在服务器端(如Web服务器)作为代理使用,而不是客户端。

1
资源服务器(文件/web/邮件) <-------> 反向代理服务器 <-------> Internet <--------> 用户

框架

框架只是一种推荐规范的代码结构,为了方便大型项目管理与构建,当然现在的框架往往不止这些,往往都包括容器等内容,常见的框架有:

  • Django
  • Flask
  • Spring
  • Struts2
  • Spring
  • Hibernate
  • ThinkPHP