一, 引言
首先来理解一下简单的一个请求发送到响应的过程.
首先, 客户端, 通常是浏览器或者一些应用发送请求到你的服务器地址, 比如访问你的 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 的插件)
TomcatApache 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 服务器
Nginx https://zhuanlan.zhihu.com/p/34943332
来源: https://www.cnblogs.com/baiyunwanglai/p/10121650.html