Nginx与Tomcat区别

问题:
以前部署web应用服务器(WEB程序代码包含有HTML,JAVA,JSP)过程中,为什么单独使用Nginx就不能部署成功,使用Tomcat就能部署成功或者Nginx+Tomcat也可以部署成功?

答案:(答案比较笼统,如果想要了解清楚,请往下看)
Nginx和Tomcat都是Web服务器,都支持HTML(静态页面)解析,但Nginx支持FastCGI(动态页面)解析,而Tomcat支持Servlet(动态页面)解析,Nginx和Tomcat支持不同的脚本编程语言和CGI(公共通用接口)规范。

一、1991年

从1991年8月6日,Tim Berners Lee在alt.hypertext新闻组贴出了一份关于World Wide Web的简单摘要,标志了Web页面在Internet上的首次登场。此时网页以HTML为主,是纯静态网页,客户通过浏览器只能浏览web服务器的静态页面,此时,网页只能访问一些文本、图片等,还没有实现用户与Web服务器之间的动态交互。


image.png

知识点1 --- Web Server
Web服务器就是一个网页解析的服务器,用来解析(handles)HTTP协议返回相应的网页信息。当Web服务器接收到一个HTTP请求(request),会返回一个HTTP响应(response),例如返回一个HTML页面。为了处理一个请求(request),Web服务器可以响应(response)一个静态页面或图片,进行页面跳转(redirect),或者把动态响应(dynamic response)的产生委托(delegate)给一些其它的程序例如CGI脚本,JSP(JavaServer Pages)脚本,servlets,ASP(Active Server Pages)脚本,服务器端(server-side)JavaScript,或者一些其它的服务器端(server-side)技术。无论它们(译者注:脚本)的目的如何,这些服务器端(server-side)的程序通常产生一个HTML的响应(response)来让浏览器可以浏览。

知识点2 --- HTML
HTML(超文本标记语言)是一种标识性的语言。它包括一系列标签,通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字,图形、动画、声音、链接等。

二、1993年

从1993年CGI出现开始,Web上的动态信息服务开始蓬勃兴起。CGI定义了Web服务器与外部应用程序之间的通信接口标准(代码要按CGI定义的规范编写,否则无法实现动态访问),因此Web服务器可以通过CGI执行外部程序,让外部程序根据Web请求内容生成动态的内容。这个时候我们已经可以在Web上提供动态功能了,比如网站访问的计数,表单的处理。但CGI对每个请求都会启动一个进程来处理,因此性能上的扩展性不高。此时,虽然实现了动态页面,但性能很差。

image.png

知识点2 --- CGI
CGI(Common Gateway Interface)公共网关接口,是外部扩展应用程序与 Web 服务器交互的一个标准接口。服务器端与客户端进行交互的常见方式多,CGI 技术就是其中之一。根据CGI标准,编写外部扩展应用程序,可以对客户端浏览器输入的数据进行处理,完成客户端与服务器的交互操作。

三、1994年

从1994年,PHP诞生了,PHP可以把程序(动态内容)嵌入到HTML(模版)中去执行,不仅能更好的组织Web应用的内容,而且执行效率比CGI还更高。之后96年出现的ASP和98年出现的JSP本质上也都可以看成是一种支持某种脚本语言编程(分别是VB和Java)的模版引擎。此时,有了这些脚本语言,搭配上后端的数据库技术,从原来低性能的动态页面访问转变成高性能的动态页面访问。


image.png

知识点1 --- Fast CGI
Fast CGI是一个可以伸缩地、高速地在HTTP服务器和动态脚本语言间通信的接口,是CGI接口的升级版本,主要优点是把动态语言和HTTP服务器分离开来。

四、1999年

从1999年Web开始广泛用于构建大型应用时,在分布式、安全性、事务性等方面的要求催生了J2EE(现在已更名为Java EE)平台,从那时开始为企业应用提供支撑平台的各种应用服务器也开始大行其道。Java Servlet、Java Server Pages (JSP)和Enterprise Java Bean (EJB )是Java EE中的核心规范,Servlet和JSP是运行在服务器端的Web组件,EJB运行在服务器端的业务组件,是一种分布式组件技术。

image.png

知识点 1 --- Servlet
Servlet是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能,统一接口。由其他内部厂商如tomcat,jetty内部实现web的功能。如一个http请求到来:容器将请求封装为servlet中的HttpServletRequest对象,调用init(),service()等方法输出response,由容器包装为httpresponse返回给客户端的过程。

知识点 2 --- Servlet Container
Servlet Container是一个Servlet的容器,用于存放Serlvet规则编写的代码,而这些编写的Serlvet代码就在容器中运行的。Tomcat就是一个Servlet容器。

知识点 3 --- JAVA(JRE,JDK,Open JDK,JVM,JSE,JEE,JME)
JRE,全称Java Runtime Environment,JRE提供Java应用运行所需的最小支撑环境,它包括JVM、核心类、和一些支持文件。
JDK,全称Java Developent Kit,作为Java应用和applets的软件开发环境。它包括Java运行时环境(JRE),解释器/加载器(Java),编译器(javac),归档器(jar),文档生成器(Javadoc)以及Java开发中所需的其他工具。
Open JDK,全称Open Java Developent Kit,其实就是JDK,但与JDK有些不同,Open JDk是遵循GPL协议,但是JAVA已经被Oracle收购,涉及到产权问题,所以,JDK有部分代码是闭源了,没有公布到Open JDK,并且Open JDK只包含最精简的JDK,而且不包含其它的软件包,例如 DB JAXP等。
JVM,全称Java Virtual Machine,首先,JVM是一套工作的规范,但是实现提供者可以独立选择算法;其次,JVM是一个满足JVM规范要求的计算机程序实现;最后,JVM是一个运行时实例,每当在提示符下编写JAVA命令运行Java类时,都会创建一个JVM实例。
JSE,指标准版,一般用于用户学习JAVA语言的基础也是使用其他两个版本的基础主要用于编写C/S项目和提供标准的JAVA类库,是所有基于Java语言开发的基础,该版本主要用于开发桌面应用程序。
JEE,指企业版,用来构建大型网站和B/S系统 ,作为一个企业版本,主要是给出一个开发企业级应用架构的解决方案,同时给出了在这个架构中相关组件以供开发人员使用,例如我们连接数据库所用的JDBC。
JME,指移动版,用来为移动设备,嵌入式系统的开发使用,例如,手机系统如大部分手机的小游戏 。

知识点 4 --- JSP
JSP(全称Java Server Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求

知识点 5 --- Nginx
Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服器,Nginx是俄罗斯访人开发的,成为目前比较流行的web应用服务器。

知识点 6 --- Tomcat
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。Tomcat是Apache Web服务器的一个扩展应用。

CGI与Servlet对比:

1、使用方面
(1)、CGI已经基本成历史,CGI的升级版本FastCGI却仍然在发展,而且作为php的使用环境大受欢迎,包括nginx也支持使用FastCGI;
(2)、而对于servlet来说,发展非常强势,作为实现微服务的前沿框架Spring Boot仍然是建立在Servlet的基础之上,未来有可能是servlet天下。

2、性能方面
(1)、CGI是Web Server针对每个Http请求生成一个CGI请求,然后将针对CGI请求生成一个单独的进程;由于CGI的这种机制,我们都知道一个普通的PC机有65536个端口,每个进程运行需要一个端口,那就是说CGI程序同时最多可以处理65536个请求,对于高并发的环境,这样的程序根本满足不了,而且每处理完一个请求都会关闭,那么对于资源的复用很差。
(2)、Servlet运行在一个进程中,对于每个请求则会生成一个单独的线程,由这些独立的线程处理对应的http请求,Servlet执行完毕后不会销毁,而是驻留在内存中直到Servlet Container关闭,以便能随时处理http请求;

3、数据共享方面
(1)、Servlet是由多个线程处理请求,所以各个请求之间可以进行很容易的进行数据共享。
(3)、CGI涉及多个进程,进程之间的通信,如果学过OS的话可以知道是多么痛苦,比如什么消息队列,管道还有共享内存等等,或者直接持久化来共享。

4、兼容性方面
(1)、针对Servlet,如果将编译生成的字节码文件移动到另外的主机或者另外的操作系统中,只要是存在JVM就仍然可以运行。
(2)、但是对于CGI程序,因为是直接面向OS,而不是像Java程序一样面向虚拟机,所以当该程序移动到另外的OS时可能需要更改代码或者重新编译。

针对CGI缺点升级改进的Fast CGI

(1)、针对客户端的多个Http请求,FastCGI程序只有一个进程来处理CGI请求,而且处理完该请求之后也不会销毁,而是作为守护进程继续运行,这样可以在它的生命周期中处理多个请求,这样避免了高并发时服务器资源的耗尽问题;
(2)、针对CGI中Web Server和CGI程序必须在同一个主机上的问题,FastCGI也进行了改进,允许FastCGI程序运行在不同的主机之上,而Web Server和FastCGI之间通过TCP连接进行通信,这种方式可以使Web Server和FastCGI程序独立配置和启动,也可以通过负载均衡提高系统的伸缩性和扩展性,当然两者仍然也可以同时部署在同一个主机上;

你可能感兴趣的:(Nginx与Tomcat区别)