一、引言
首先来理解一下简单的一个请求发送到响应的过程。
- 首先,客户端,通常是浏览器或者一些应用发送请求到你的服务器地址,比如访问你的Url或者其他的东西。而我们的服务器通常要分为两个部分,一部分是服务器硬件,有了硬件之后还有有硬件上对应运行的软件。即服务器软件
- 其次,服务器的硬件部分接收到了这一段请求,将其递交给对应的进程,服务器软件。此时这个服务器软件即为Web服务器,比如说Apache。
- 再然后,这些Web服务器服务器本身不一定提供动态页面的访问能力,所以对jsp或者一些其他的访问需要其他的东西来辅助实现,这个东西类似于插件(客观来讲Tomcat不是Apache的一个插件,在这里暂且理解为插件)。在本例中,这个插件就是Tomcat。
- Tomcat是一个运行环境,或者叫容器。Tomcat负责实例化jsp并且处理请求(通俗的讲就是“运行”jsp,搞到对应的响应信息),并且返回一个响应到apache,apache再调度硬件资源,则继续将响应返回到客户端。
- 至此,一个响应完成。
二、定义
服务器
硬件角度上说就是一台高性能的Computer。我们通常指的服务器其实应该是装有能够处理具体请求事务的服务器软件的Computer。比如最常见的www服务器、mail服务器、计费服务器、ftp服务器等等。很多时候人们常把诸如Tomcat、IIS、Weblogic 也称之为web服务器,其实这些只是用于开发、集成、部署和管理Web应用、网络应用和数据库应用的应用服务器软件。
Web服务器
web服务器可以处理Http协议,当web服务器接受到一个Http请求,会返回一个Http响应,例如送回一个HtMl页面。
web服务器可以响应针对静态页面或者图片的请求,进行页面跳转(redirect),或者把动态响应(dynamic response)的产生委托(delegate)给一些其它的程序,例如 CGI 脚本,JSP(JavaServer Pages)脚本,servlets,ASP(Active Server Pages)脚本,服务器端 JavaScript,或者一些其它的服务器端技术。
web服务器仅仅提供一个可以执行服务器端程序和返回(程序产生)响应的环境,而不会超出职能范围
web服务器主要是处理需要向浏览器发送Html的请求以供浏览
Web服务器也可以叫做应用服务器。它的功能比web容器要强大的多,因为它可以部署EJB应用,可以实现容器管理的事务,一般的应用服务器有weblogic和websphere等,它们都是商业服务器,功能强大但都是收费的。
Web应用程序需要部署到Web容器或者Web服务器中才能运行,两者都必须符合J2EE规范。
Web容器
web容器就是一种服务程序,在服务器中一个端口就对应一个提供相应服务的程序(比如Apache默认的端口为80),给处于其中的应用程序组件提供环境,使其直接跟容器中的环境变量交互,不必关注其它系统问题。而这个程序就是处理服务器从客户端收到的请求,如Java中的Tomcat容器,ASP的IIS都是这样的容器。这些容器兼容了Web服务器软件的一些功能。一个服务器可以有多个容器。
如果web服务器应用得到一个指向servlet的请求(而不是其他请求,如请求一个普通的静态HTML),此时服务器不是把这个请求交给servlet本身,而是交给部署该servlet的容器,要由容器调用servlet的方法,如doPost()或doGet()。
笔者在网上搜到的这些概念,很多时候也都混淆不清。容器和服务器有时候的定义也比较模糊,容器兼有了服务器的职责和能力。
容器中,中小型的Tomcat,Nginx大型的,JBoss、Weblogic、WebSphere等
应用程序服务器 The Application Servlet
根据定义,作为应用程序服务器,要求可以通过各种协议包括Http协议把商业逻辑暴露给expose客户端应用程序,应用程序使用此商业逻辑就像你调用对象的一个方法或过程一样。
Servlet(Server Applet),全称 Java Servlet,未有中文译文。是用 Java 编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。狭义的 Servlet 是指 Java 语言实现的一个接口,广义的 Servlet 是指任何实现了这个 Servlet 接口的类,一般情况下,人们将 Servlet 理解为后者。
Servlet 运行于支持 Java 的应用服务器中。从实现上讲,Servlet 可以响应任何类型的请求,但绝大多数情况下 Servlet 只用来扩展基于 HTTP 协议的 Web 服务器。
Apache
Apache就是一个服务器(软件),提供了静态页面的访问能力。它配置上插件(模块)后可以以各种语言实现动态页面。(但是一定要注意Tomcat并不是Apache的插件)
Tomcat
Apache Tomcat(即平时所说的Tomcat),也是一个服务器。在这个案例中,Tomcat充当了一个插件的作用,这个插件是针对于Java的,或者说是jsp/servlet的。它是一个容器。何为容器?容器么,就是容器。容的是什么,JSP、Servlet。容器管理jsp、servlet的声明周期,包括创建,运行,销毁。它是一个jsp、servlet的运行环境。通俗点说,请求发过来,Tomcat负责执行JSP、Servlet,并返回结果。关于生命周期这东西,在此不做阐述。也就是说,没有Tomcat,Apache是不认你JSP的。懂设计模式的可以想想了。。。当然,整个过程都有设计模式的影子
要注意:Tomcat本身也是可以单独作为服务器来运行的。Tomcat 有时也被称为Apache Tomcat,这个Apache指的并不是Apache服务器,而是一个“商标”,因为Tomcat是属于Apache这个项目的
Apache与Tomcat比较联系
apache支持静态页,tomcat支持动态的,比如servlet等。
一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是由tomcat来处理的。
apache可以支持php\cgi\perl,但是要使用java的话,你需要tomcat在apache后台支撑,将java请求由apache转发给tomcat处理。
apache是web服务器,Tomcat是应用(java)服务器,它只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行。
共同点
两者都是apache组织开发的
两者都有HTTP服务的功能
两者都是免费的
不同点:
Apache是专门用了提供HTTP服务的,以及相关配置的(例如虚拟主机、URL转发等等)
Tomcat是Apache组织在符合J2EE的JSP、Servlet标准下开发的一个JSP服务器