之前的文章讲述的是web中两大服务器软件:Apache和Nginx,在这,对此我们先做一个简单的小结。
Apache支持支持模块多,性能稳定,Apache本身是静态解析,适合静态HTML、图片等,但可以通过扩展脚本、模块等支持动态页面等。但是其配置相对复杂,自身不支持动态页面。
Nginx,轻量级的HTTP服务器,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。其特点是占有内存少,并发能力强,易于开发,部署方便。Nginx 支持多语言通用服务器。但是,Nginx 只适合静态和反向代理。其优点在于支持:负载均衡、反向代理、处理静态文件。Nginx 处理静态请求的速度高于Apache(3倍以上)。
Apache是同步多进程模型,一个连接对应一个进程,而nginx是异步的,多个连接(万级别)可以对应一个进程。
nginx轻量级,抗并发,处理静态文件好
Apache超稳定,对PHP支持比较简单,nginx需要配合其他后端用,处理动态请求有优势,建议使用前端nginx抗并发,后端apache集群,配合起来会更好。
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器。
Tomcat是应用(Java)服务器,它只是一个Servlet(JSP也翻译成Servlet)容器,可以认为是Apache的扩展,但是可以独立于Apache运行。
对于学习了或者正在学习Java的朋友对Tomcat应该是比较熟悉的了。
最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
其优点在于它是一个动态解析容器,处理动态请求,是编译JSP/Servlet的容器,其缺点也十分明显,只能做Java服务器,并且在并发量上有限制。
至于更加深层的原因,需要有一定的架构思想才能深入理解和总结归纳Apache、Nginx和Tomcat的区别于联系。本文核心是针对初学者而言,主要讲解Tomcat的部署操作流程,因此,更深的原因在这里就不再赘述了,但是我们一定要知道“无论什么,存在的就是合理的,而我们所要做的便是透过现象看本质!”
Tomcat 是 Apache 下的一个子项目,它具备 Web 服务器的所有功能,不仅可以监听接受请求并响应静态资源,而且可以在后端运行特定规范 的 Java 代码 Servlet,同时将执行的结果以 HTML 代码的形式写回客户端。
Tomcat的三大核心组件:Web容器、Servlet容器以及JSP容器
1) 请求被发送到本机端口 8080,被在那里侦听的 Coyote HTTP/11.1 Connector(连接器) 获得。
2) Connector 把该请求交给它所在的 Service 的 Engine(引擎) 来处理,并等待来自 Engine的回应。
3) Engine 获得请求 localhost/yy/index.JSP,匹配它所拥有的所有虚拟主机 Host;
Engine 匹配到名为 localhost 的 Host。即使匹配不到也把请求交给该 Host 处理, 因为该 Host 被定义为该 Engine 的默认主机。
4) localhost Host 获得请求/yy/index.JSP,匹配它所拥有的所有 Context;
Host 匹配到路径为/yy 的 Context。如果匹配不到,就把该请求交给路径名为“”的 Context 去处理。
5) path=”/yy”的 Context 获得请求/index.JSP,在它的 mapping table 中寻找对应的 Servlet。
Context 匹配到 URL PATTERN 为*.JSP 的 Servlet,对应于 JSPServlet 类。
6) 构造 HttpServletRequest 对象和 HttpServletResponse 对象, 作为参数调用JSPServlet 的 doGet()或 doPost()方法。
7) Context 把执行完了之后的 HttpServletResponse 对象返回给 Host。
8) Host 把 HttpServletResponse 对象返回给 Engine。
9) Engine 把 HttpServletResponse 对象返回给 Connector。
10) Connector 把 HttpServletResponse 对象返回给客户 browser。
或许看了上面的过程,感觉实在是过于复杂,下面给出具体的流程图,大家可以根据流程图进行逻辑上的理解:
Connector 用于接收请求并将请求封装成Request 和Response 来具体处理,(最底层是使用Socket 来进行连接的)其中 Request 和Response 是按照HTTP 协议来封装的,所以Connector 同时实现了TCP/IP 协议和HTTP 协议, Request 和Response 封装完后交给Container 进行处理,Container 即Servlet 的容器, Container 处理完之后返回给Connector,最后Connector 使用Socket 将处理结果返回给客户端,这样整个请求就处理完了,具体请求过程如上图所示。
而Container 则是Tomcat 中容器的接口,通常使用的Servlet 就封装在其子接口Wrapper 中。(Container 一共有4 个子接口Engine 、Host 、Context 、Wrapper 和一个默认实现类ContainerBase,每个子接口都是一个容器,这4 个子容器都有一个对应的StandardXXX 实现类,并且这些实现类都继承ContainerBase 类。另外Container 还继承Lifecycle 接口,而且ContainerBase 间接继承LifecycleBase,所以Engine 、Host 、Context 、Wrapper 4 个子容器都符合前面讲过的Tomcat生命周期管理模式。)
所需环境:
部署具体步骤:
[root@localhost tomcat]# ls
apache-tomcat-9.0.16.tar.gz jdk-8u201-linux-x64.rpm
软件包链接:https://pan.baidu.com/s/1q9igHqlkIVJtqRS8zbuibQ
提取码:xzaj
[root@localhost tomcat]# rpm -ivh jdk-8u201-linux-x64.rpm
警告:jdk-8u201-linux-x64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ec551f03: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:jdk1.8-2000:1.8.0_201-fcs ################################# [100%]
Unpacking JAR files...
tools.jar...
plugin.jar...
javaws.jar...
deploy.jar...
rt.jar...
jsse.jar...
charsets.jar...
localedata.jar...
[root@localhost tomcat]# cd /usr/java/
[root@localhost java]# ls
default jdk1.8.0_201-amd64 latest
[root@localhost java]# cd jdk1.8.0_201-amd64/
[root@localhost jdk1.8.0_201-amd64]# ls
bin lib src.zip
COPYRIGHT LICENSE THIRDPARTYLICENSEREADME-JAVAFX.txt
include man THIRDPARTYLICENSEREADME.txt
javafx-src.zip README.html
jre release
bin/:命令文件存放目录
jre/:jvm的虚拟机存放位置
lib/:函数库目录
src.zip/:源码压缩包目录
[root@localhost jdk1.8.0_201-amd64]# pwd
/usr/java/jdk1.8.0_201-amd64
[root@localhost jdk1.8.0_201-amd64]# java -version #简化版jdk原本就集成在Centos7中
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
[root@localhost jdk1.8.0_201-amd64]#
[root@localhost jdk1.8.0_201-amd64]# vim /etc/profile
[root@localhost jdk1.8.0_201-amd64]# source /etc/profile
[root@localhost jdk1.8.0_201-amd64]# tail -3 /etc/profile #添加的内容
export JAVA_NAME=/usr/java/jdk1.8.0_201-amd64 #工作路径
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar #类文件的位置
export PATH=$JAVA_NAME/bin:$PATH #命令文件
[root@localhost jdk1.8.0_201-amd64]# java #证明source成功
java javafxpackager javapackager javaws.itweb
javac javah java-rmi.cgi
javadoc javap javaws
[root@localhost jdk1.8.0_201-amd64]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
[root@localhost jdk1.8.0_201-amd64]#
[root@localhost tomcat]# ls
apache-tomcat-9.0.16.tar.gz jdk-8u201-linux-x64.rpm
[root@localhost tomcat]# tar zxf apache-tomcat-9.0.16.tar.gz -C /opt
[root@localhost tomcat]# cd /opt/
[root@localhost opt]# ls
apache-tomcat-9.0.16 rh
[root@localhost opt]# mv apache-tomcat-9.0.16/ tomcat
[root@localhost opt]# ls
rh tomcat
[root@localhost opt]# cd tomcat/
[root@localhost tomcat]# ls
bin CONTRIBUTING.md logs RELEASE-NOTES webapps
BUILDING.txt lib NOTICE RUNNING.txt work
conf LICENSE README.md temp
其中 webapps是站点,
[root@localhost tomcat]# cd bin/
[root@localhost bin]# ls
bootstrap.jar makebase.sh
catalina.bat setclasspath.bat
catalina.sh setclasspath.sh
catalina-tasks.xml shutdown.bat
ciphers.bat shutdown.sh
ciphers.sh startup.bat
commons-daemon.jar startup.sh
commons-daemon-native.tar.gz tomcat-juli.jar
configtest.bat tomcat-native.tar.gz
configtest.sh tool-wrapper.bat
daemon.sh tool-wrapper.sh
digest.bat version.bat
digest.sh version.sh
makebase.bat
[root@localhost bin]# ln -s /opt/tomcat/bin/startup.sh /usr/bin
[root@localhost bin]# ln -s /opt/tomcat/bin/shutdown.sh /usr/bin[root@localhost bin]# systemctl stop firewalld.service
[root@localhost bin]# setenforce 0
[root@localhost bin]# startup.sh #开启服务
Using CATALINA_BASE: /opt/tomcat
Using CATALINA_HOME: /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_201-amd64
Using CLASSPATH: /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@localhost bin]# netstat -antp | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 47064/java
[root@localhost bin]# shutdown.sh
Using CATALINA_BASE: /opt/tomcat
Using CATALINA_HOME: /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME: /usr/java/jdk1.8.0_201-amd64
Using CLASSPATH: /opt/tomcat/bin/bootstrap.jar:/opt/tomcat/bin/tomcat-juli.jar
[root@localhost bin]# netstat -antp | grep 8080
tcp6 0 0 ::1:39678 ::1:8080 TIME_WAIT -
当我们开启Tomcat服务的时候,可以在浏览器中使用“IP地址:8080”进行访问,如下图所示
本文主要结合之前的Apache与Nginx,将二者进行简单的对比,归纳,从而引出Tomcat应用服务器,讲述了其概念、其自身的特性与三大核心组件:三个容器(Web、JSP、Servlet),接着利用一个简单的流程图详细讲述了Tomcat处理请求过程,最后给出如何安装、部署、测试Tomcat服务器,谢谢您的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。