一、概述
简略介绍
- Tomcat 收费的、凋谢源代码的 Web 应用服务器,属于轻量级应用服务器。
- 在中小型零碎和并发拜访用户不是很多的场合下被广泛应用
是开发和调试 JSP 程序的首选。 - Apache 软件基金会(Apache Software Foundation)Jakarta 我的项目中的一个外围我的项目,由 Apache、Sun 和一些公司及集体共同开发而成。深受 Java 爱好者的青睐,并失去局部软件开发商的认可。目前比拟风行的 Web 应用服务器 Tomcat 比照于 Apache 或者 Nginx 这些 Web 服务器,都具备解决 HTML 页面的性能,然而因为其解决动态 HTML 的能力远不迭 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,独自运行在后端。
外围组件
- Web 容器 —— 实现 Web 服务器的性能。
- Servlet 容器 —— 名字为 catalina,用于解决 Servlet 代码。
- JSP 容器 —— 用于将 JSP 动静网页翻译成 Servlet 代码。
JavaServlet
JavaServlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 web 浏览器或其余 HTTP 客户端的申请和 HTTP 服务器上的数据库或应用程序之间的中间层。应用 Servlet,能够收集来自网页表单的用户输出,出现来自数据库或者其余源的记录,还能够动态创建网页。与 CGI (公共网关接口)性能相相似。
JSP 容器
- JSP 全称:Java Server Pages
- 是一种动静网页开发技术。它应用 JSP 标签在 HTML 网页中插入 Java 代码。标签通常以 <% 结尾 以 %> 完结。JSP 是一 种 Java servlet,次要用于实现 Java web 应用程序的用户界面局部。
- JSP 通过网页表单获取用户输出数据、拜访数据库及其他数据源,而后动静地创立网页。
Tomcat 顶层架构
- Tomcat 中最顶层的容器是 Server,代表着整个服务器,一个 Server 能够蕴含至多 - - 个 Service, 用于具体提供服务。
- Service 次要蕴含两个局部: Connector 和 Container. Tomcat 的心脏就是这两个组件,这两个组件的作用: Connector 用 于解决连贯相干的事件,并提供 Socket 与 Request 和 Response 相干的转化;Container 用于封装和治理 Servlet,以及具体解决 Request 申请。
- 一个 Tomcat 中只有一 个 Server,一个 Server 能够蕴含多个 Service,一 个 Service 只有一个 Container, 然而能够有多个 Connectors, 因为一个服务能够有多个连贯,如同时提供 Http 和 Https 链接,也能够提供向雷同协定不同端口的连贯。
- 多个 Connector 和一个 Container 就造成了一个 Service, 有了 Service 就能够对外提供服务了,然而 Service 还要一个生存的环境,必须要有 人可能给她生命、把握其生死大权,那就非 Server 莫属了! 所以整个 Tomcat 的生命周期由 Server 管制。另外,上述的蕴含 关系或者说是父子关系,都能够在 tomcat 的 conf 目录下的 server . xml 配置文件中看出。
- server.xml 中定 义 <Server port-” 8005”shutdown-” SHUTDOWN”> 这会让 Tomcat6 启动 - - 个 server 实例 (即 - 一个 JVM),它监听在 8005 端口以接管“SHUTDOWN” 命令,如果接管到了就会敞开 Tomcat。各 Server
的定义不能应用同一 - 个端口,这意味着如果在同 - - 个物理机上启动了多个 Server 实例,必须配置它们应用不同的端口。
个子容器的作用
- Engine: 引擎,用来治理多个站点,一个 Service 最多只能有一个 Engine。
- Host: 代表一个站点,也能够叫虚拟主机,通过配置 Host 就能够增加站点。
- Context: 代表一个应用程序,对应着平时开发的一套程序,或者一个 WEB-INF 目录以及下而的 web. xml 文件:
- Wrapper: 每一 -Wrapper 封装着一个 Servlet。
Tomcat 申请过程
- 用户在浏览器中输出该网址,申请被发送到本机端口 8080,被在那里监听的 Coyote HTTP/1.1 Connector 取得。
- Connector 把该申请交给它所在的 Service 的 Engine (Container) 来解决,并期待 Engine 的回应。
- Engine 取得申请 localhost/test/index. jsp, 匹配所有的虚拟主机 Host。
- Engine 匹配到名为 localhost 的 Host (即便匹配不到也把申请交给该 Host 解决,因为该 Host 被定义为该 Engine 的默认主机),名为 localhost 的 Host 取得申请 /test/index.jsp, 匹配它所领有的所有 Context。Host 匹配到门路为 /test 的 Context (如果匹配不到就把该申请交给路径名为 ” “ 的 Context 去解决)。
- path-” /test” 的 Context 取得申请 /index. jsp, 在它 mapping table 中寻找出对应的 Servlet. Context 匹配到 URL
Pattern 为 * . jsp 的 Servlet,对应于 JspServlet 类。 - 结构 HttpServletRequest 对象和 HttpServletResponse 对象,作为参数调用 JspServlet 的 doGet ()或 doPost(), 执行业务逻辑、数据存储等。
- Context 把执行完之后的 HttpServletResponse 对象返回给 Host。
- Host 把 HttpServletResponse 对象返回给 Engine。
- Engine 把 HttpServletResponse 对象返回 Connector。
- Connector 把 HttpServletResponse 对象返回给客户 Browser。
Tomcat 服务部署
装置 JDK
在部署 Tomcat 之前必须装置好 jdk,因为 jdk 是 Tomcat 运行的必要环境。
(1)敞开防火墙,将装置 Tomcat 所需软件包传到 /opt 目录下
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
(2)装置 JDK
cd /opt
rpm -qpl jdk-8u201-linux-x64.rpm
rpm -ivh jdk-8u201-linux-x64.rpm
java -version
(3)设置 JDK 环境变量
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile.d/java.sh
java -version
-------java.sh 中补充知识点 -----------------------------------
CLASSPATH:编译、运行 Java 程序时,JRE 会去该变量指定的门路中搜寻所需的类 (.class) 文件。dt.jar:是对于运行环境的类库,次要是 swing 的包。tools.jar:次要是一 些 jdk 工具的类库,包含 javac,java,javap,javadoc 等。JDK:java development kit (java 开发工具)
JRE:java runtime environment (java 运行时环境)
JVM:java virtuak machine (java 虚拟机),使 java 程序能够在多种平台上运行 class 文件。
(4)编写一个 java 脚本来验证装置
vim kkk.java
#编写一个 java 程序, 输入“hello world!”public class kkk {public static void main(String[] args){System.out.println("Hello World!");
}
}
#检测 JDK 环境是否设置胜利
javac kkk.java
java kkk
装置启动 Tomcat
cd /opt/
tar zxvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
## 启动 tomcat##
/usr/local/tomcat/bin/startup.sh
netstat -natp | grep 8080
#应用浏览器拜访 Tomcat 的主页
http://192.168.19.11:8080
优化 Tomcat 启动速度
vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
#批改 117 行;##/dev/random 和 /dev/urandom 都是伪终端,然而 /dev/urandom 提供的数据流更快
securerandom.source=file:/dev/urandom
#创立一个软连贯,将 tomcat 的命令放入 /usr/local/bin
ln -s /usr/local/tomcat/bin/* /usr/local/bin/
#重启 Tomcat
shutdown.sh
startup.sh
tomcat 的次要目录
Tomcat 虚拟主机配置
很多时候公司会有多个我的项目须要运行,那么必定不可能是一台服务器上运行多个 Tomcat 服务,这样会耗费太多的系统资源。此时,就须要应用到 Tomcat 虚拟主机。例如当初新增两个域名 www.lei.com 和 www.dian.com,心愿通过这两个域名拜访到不同的我的项目内容。
(1)创立 lei 和 dian 我的项目目录和文件
mkdir /usr/local/tomcat/webapps/lei
mkdir /usr/local/tomcat/webapps/dian
echo 'this is lei !' > /usr/local/tomcat/webapps/lei/index.jsp
echo 'this is dian!' > /usr/local/tomcat/webapps/dian/index.jsp
(2)批改 Tomcat 主配置文件
vim /usr/local/tomcat/conf/server.xml
#165 行
<Host name="www.lei.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/lei" path=""reloadable="true" />
</Host>
<Host name="www.dian.com" appBase="webapps" unpackWARs="true"
autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
<Context docBase="/usr/local/tomcat/webapps/dian" path=""reloadable="true" />
</Host>
#重启服务;命令门路优化后能够间接应用 shutdown.sh 和 startup.sh
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
#---------------- 参数解释 -----------------------------
Host name : 主机名
appBase : Tomcat 程序工作目录,相对路径为 webapps,绝对路径为 /usr/local/tomcat/webapps
unpackWARs : 是否解压 war 包
autoDeploy : 批示 Tomcat 运行时,如有新的 WEB 利用是否容许主动部署
xmlValidation : 是否验证 xml 文件执行有效性测验的标记
xmlNamespaceAware : 是否启用 xml 命名空间,设置该值与 xmlValidation 为 true,示意对 web.xml 文件执行有效性测验
docBase : WEB 利用的目录
path: 设置拜访的 URI 为 WEB 利用的根目录
reloadable : 是否在程序有改变时从新载入
(3)验证
echo "192.168.19.11 www.lei.com www.dian.com" >> /etc/hosts
Tomcat 优化
Tomcat 默认装置下的缺省配置并不适宜生产环境,它可能会频繁呈现假死景象须要重启,只有通过一直压测优化能力让它最高效率稳固的运行。优化次要包含三方面,别离为操作系统优化 (内核参数优化),Tomcat 配置文件参数优化,Java 虚拟机(JVM) 调优。明天咱们就理解一下 Tomcat 配置文件参数优化。
配置文件参数优化
批改配置文件
vim /usr/local/tomcat/conf/server.xml
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
#72 行插入
minSpareThreads="50"
enableLookups="false"
disableUploadTimeout="true"
acceptCount="300"
maxThreads="500"
processorCache="500"
URIEncoding="UTF-8"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/gif,image/jpg,image/png" />
#优化就间接用 shutdown.sh 和 startup.sh
/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
最初
马上秋招,为大家筹备了一大波面试题!欢送关注公众号:前程有光,支付一线大厂 Java 面试题总结 + 各知识点学习思维导 + 一份 300 页 pdf 文档的 Java 外围知识点总结! 这些材料的内容都是面试时面试官必问的知识点,篇章包含了很多知识点,其中包含了有基础知识、Java 汇合、JVM、多线程并发、spring 原理、微服务、Netty 与 RPC、Kafka、日记、设计模式、Java 算法、数据库、Zookeeper、分布式缓存、数据结构等等。