一、介绍tomcat服务器
Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,是 Apache 软件基金会的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。
Tomcat 属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。一般来说,Tomcat 虽然和 Apache 或者 Nginx 这些 Web 服务器一样,具有处理 HTML 页面的功能,然而由于其处理静态 HTML 的能力远不及 Apache 或者 Nginx,所以 Tomcat 通常是作为一个 Servlet 和 JSP 容器,单独运行在后端。
1、 servlet
Servlet 是Java Servlet 的简称,可以理解为是一个服务连接器,是用 Java 编写的服务器端程序,具有独立于平台和协议的特性, 简单的理解:servlet 就是一个中间件,包含了接口和方法,将客户端和数据库连接,从而实现动态网页的创建。
2、JSP
JSP 全称 Java Server Pages,是一种动态网页开发技术。它使用 JSP 标签在HTML网页中插入 Java代码。标签通常以 <% 开头,以 %> 结束。 JSP 是一种 Java servlet,主要用于实现 Java web 应用程序的用户界面部分。 JSP 通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页
3、tomcat核心组件
通常意义上的 web 服务器接受请求后,只是单纯地响应静态资源,如HTMI文件,图片文件等,不能在后端进行一定的处理操作。
Tomcat是 Apache 下的一个子项目,它具备 web服务器的所有功能(WEB容器嵌入Servlet-》动态请求),不仅可以监听接受请求并响应静态资源,而且可以在后端运行特定规范的Java代码servlet,同时将执行的结果以HTML代码的形式写回客户端。
tomcat主要的三个容器:web容器、jsp容器、servlet容器。 什么是容器? 容器就是封装一组资源/功能集合的个体。
Tomcat 由一系列的组件构成,其中核心的组件容器有三个:
Web 容器: 完成Web服务器的功能HTTP/HTTPS 请求的接收和响应。 描述: ①接收、响应请求,②展示动态页面
JSP 容器 : 用以将index.jsp文件中的java代码翻译成Servlet 代码。 描述: index.jsp文件里面有静态展示的html语言,还有一些java类代码,但是文件中java代码无法直接被tomcat执行,所以需要先翻译为可以执行的代码方式,也就是翻译成servlet代码格式。
Servlet 容器: 由名称为Catalina的脚本来处理Servlet 代码。 描述: 使用catalina进行处理JSP容器翻译过来的servlet代码。
总体描述:(各组件之间如何对接) 假如用户需要登录支付宝查看个人信息,通过网页的nginx服务的80端口,请求访问动态请求,nginx将请求反向代理到tomcat服务的8080端口,那么tomcat就收到了用户的请求, 请求给到Web 容器中有index.jsp 文件,里面存在java代码,需要处理动态请求,tomcat就去读取该文件中的java代码,但是java代码无法被tomcat识别, 所以就需要使用JSP 容器将index.jsp文件中的java代码,翻译为servlet代码,翻译成servlet代码后,就需要使用servlet 容器进行处理servlet代码。 那么selvlet容器会通过catalina脚本执行servlet代码。执行完成之后,使用api接口调用对应的支付宝应用, 支付宝收到用户的请求后,会进行调用mysql数据库的3306端口进行确认数据,最后将数据返回到用户。
4、Tomcat处理请求过程
Tomcat的端口为8080,但是监听8080端口的不是tomcat主进程,而是connector的连接器(java写的)监听的。使用netstat -natp |grep tomcat 无法查看到tomcat端口需要使用:netstat -natp | grep 8080 查看
1、Tomcat 功能组件结构
Tomcat 的核心功能有两个,分别是负责接收和反馈外部请求的连接器 Connector,和负责处理请求的容器 Container。 其中连接器和容器相辅相成,一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Service。
Connector:负责对外接收和响应请求。它是Tomcat与外界的交通枢纽,监听端口接收外界请求,并将请求处理后传递给容器做业务处理,最后将容器处理后的结果响应给外界。 Container:负责对内处理业务逻辑。其内部由 Engine、Host、Context和Wrapper 四个容器组成,用于管理和调用Servlet 相关逻辑。 Service:对外提供的 Web 服务。主要包含 Connector 和 Container 两个核心组件,以及其他功能组件。Tomcat 可以管理多个 Service,且各 Service 之间相互独立。
Container 结构分析
每个 Service 会包含一个 Container 容器,在 Container 内部包含了 4 个子容器。
4个子容器的作用分别是 (1)Engine:引擎,用来管理多个虚拟主机,一个 Service 最多只能有一个 Engine; (2)Host:代表一个虚拟主机,也可以叫站点,通过配置 Host 就可以添加站点; (3)Context:代表一个 Web 应用,包含多个 Servlet 封装器,用于连接Host项目和servlet容器 (4)Wrapper:封装器,容器的最底层。每一个 Wrapper 封装着一个 Servlet,负责对象实例的创建、执行和销毁功能。
Engine、Host、Context 和 Wrapper,这四个容器之间属于父子关系。 容器由一个引擎可以管理多个虚拟主机。 每个虚拟主机可以管理多个 Web 应用。 每个 Web 应用会有多个 Servlet 封装器。
用户请求过程 ①用户访问网页内容,申请动态访问请求,通过nginx的80端口反向代理到tomcat的8080端口。 ②到了tomcat后,被在那里监听的connector(连接器中)的Coyote(java框架)监听到。 ③接收到请求之后,将请求交给container(容器)中的engine(引擎)进行处理,engine是作为容器运行的动力核心。 ④基于engine支撑,容器中会跑很多host虚拟主机(项目),这些虚拟主机中也会有很多的项目,然后通过context(当前程序所处的环境)连接到servlet容器。 ⑤servlet处理完成后返回给context。 ⑥context再返回给engine,engine再返回给端口,端口最后将页面展现给用户
二、tomcat数据流向
用户请求(访问80端口)——》 发送请求发送给tomcat——》 tomcat有一个端口在监听8080端口) 从8080端口进入流量的会被在此端口的线程监听到 给与我们的web容器进行处理(有index.html页面显示出来 从8080端口来时会有交互界面 会读取到index.jsp这种java代码) 但是java代码无法直接使用——》 需要利用到jsp容器 将index.jsp中的java的servlet代码进行翻译 servlet容器处理 通过catalina程序/脚本来处理从JSP容器这过来的servlet代码 并不是直接对接mysql数据库 而是直接对接用户的请求例如app中的某个功能模块 比方说看个人信息 servlet容器与app接是api进行对接(具体的URL) 数据流向最终会通过用户请求内容 去mysql数据库寻找相应的内容 最后返回给用户
三、部署Tomcat
1、部署(JDK)
systemctl stop firewalld systemctl disable firewalld setenforce 0
将所需要的安装包 放入 /opt/Tomcat下
查看java版本 java -version
1、解jdk包
rpm -ivh jdk-8u201-linux-x64.rpm
2、设置JDK的环境变量
vim /etc/profile.d/java.sh #/etc/profile.d/ 环境变量脚本目录 export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64 #输出指定java所需的类文件 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 查看版本
3、设置好以后,编写java脚本来验证安装
首先使用文本工具编写java源代码,比如abc.java ; 在命令行中,输入命令:javac abc.java,对源代码进行编译,生成class字节码文件; 编译完成后,如果没有报错信息,输入命令:java abc,运行class字节码文件,由 JVM对字节码进行解释和运行,打印“Hello World"。
2、安装启动 Tomcat
1、解tomcat包
cd /opt/Tomcat tar zxvf apache-tomcat-9.0.16.tar.gz 解包 mv apache-tomcat-9.0.16 /usr/local/tomcat #将解压后的包剪切到/usr/local 目录中,并改名为tomcat
查看
2、查看tomcat文件及文件说明
我们如果要执行、持续运行一个java开发应用服务,在经过简单配置之后,可以直接将war包、jar包,放入到webapps中,来让tomcat运行。 主要目录说明 1、bin :存放启动和关闭Tomcat的脚本文件,比较常用的是:catalina.sh 、 startup.sh 、 shutdown.sh 2、conf: 存放Tomcat服务器的各种配置文件,比较常用的是server.xml、context.xml、tomcat-users.xml、web.xml 3、lib: 存放Tomcat服务器的jar包,一般不做任何改动,除非连接第三方服务,比如redis,那就需要添加对应的jar包。 4、logs:存放Tomcat日志 5、temp:存放Tomcat运行时产生的文件 6、webapps:存放项目资源的目录 7、work: Tomcat工作目录,一般清除Tomcat缓存的时候会使用到 8、src: 存放Tomcat 的源代码 9、doc: 存放Tomcat文档 Tomcat配置文件详解 1、catalina.policy :权限控制配置文件 2、catalina.properties: Tomcat的属性配置文件 3、context.xml : 上下文配置文件 4、logging.properties:日志相关配置文件 5、server.xml : 主配置文件,通过配置文件,可以修改tomcat的启动端口,网站目录,虚拟主机,开启https等功能 6、tomacat-user.xml/.xsd: 管理用户配置文件 7、web.xml: tomcal的servlet、servlet-mapping、filter、MIME等相关配置
3、优化管理tomcat
启动tomcat #优化管理 ln -s /usr/local/tomcat/bin/startup.sh /usr/local/bin/ ln -s /usr/local/tomcat/bin/shutdown.sh /usr/local/bin/
将启动脚本放入环境中方便启动 后台启动 /usr/local/tomcat/bin/startup.sh 或 /usr/local/tomcat/bin/catalina.sh start 前台启动(终端关闭,tomacat停止运行) /usr/local/tomcat/bin/catalina.sh run 关闭 /usr/local/tomcat/bin/shutdown.sh
启动tomcat
4、页面访问tomcat
三、优化Tomcat
优化 Tomcat 启动速度 生产环境中第一次启动 tomcat 可能会发现 tomcat 启动很慢,默认情况下可能需要几十秒,此时可以修改 jdk 参数进行优化。 vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security ——修改117行—– securerandom.source=file:/dev/urandom ##/dev/random和/dev/urandom都是伪终端,但是/dev/urandom提供的数据流更快
#主配置文件/usr/local/tomcat/conf/server.xml #搜索8080(69行) <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" # 连接超时时间(毫秒) redirectPort="8443" /> #SSL 重定向/映射443,从8080端口进来都会加密为(https) <Connector 连接器,连接前web服务 port="8080" 端口 protocol="HTTP/1.1" 版本协议,表示长连接
#/dev/random和/dev/urandom都是伪终端,但是/dev/urandom提供的数据流更快
四、Tomcat虚拟主机配置
一台服务器上运行多个 Tomcat 服务,这样会消耗太多的系统资源。此时,就需要使用到 Tomcat 虚拟主机。例如现在新增两个域名 www.gang1.com 和 www.gang2.com ,希望通过这两个域名访问到不同的项目内容。(tomcat做为web 服务器用的)
虚拟主机的概念: 是模拟多个渠道(功能)
- 优点: 充分使用资源、管理便捷、降低架构的复杂度,方便自定义“扩容”(创建多个虚拟主机) 缺点: 需要其它资源的支持、消耗相同的网络资源、单点故障
nginx中的虚拟主机: 基于不同的IP、基于不同的域名、基于不同的端口。(配置文件中,每一个server就是一个虚拟主机)
Tomcat中的虚拟主机: 使用一台tomcat服务运行多台虚拟主机,通过不同的虚拟主机访问不同的项目。(配置文件中,每一个host就是一个虚拟主机)
1、创建2个项目目录和文件
本机映射及创建访问文件
2、修改 Tomcat 主配置文件
vim /usr/local/tomcat/conf/server.xml (165行插入) <Host name="www.gang1.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context docBase="/usr/local/tomcat/webapps/gang1" path="" reloalable="true" /> </Host> <Host name="www.gang2.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context docBase="/usr/local/tomcat/webapps/gang2" path="" reloalable="true" /> </Host> 配置文件介绍 Host name:主机名 appBase:Tomcat程序工作目录,即存放web应用程序的目录,相对路径:webapps,绝对路径:/usr/local/tomcat/webapps unpackWARs:在启用此webapps时是对WAR格式的归档文件先进行展开 autoDeploy:在Tomcat处于运行状态时放置于appBase目录中的应用城西是否进行更新 xmlValidation:是否验证xml执行有效检验的标志 xmlNamespaceAware:是否启用命令空间,设置该值于xmlValidation为true,表示web.xml文件执行有效性验证 docBase:相应的web应用程序的存放位置,也可以使用相对路径,起始路径为此context所属Host中appBase定义的路径 path:相对web服务器跟路径而言的URI,如果为空,则表示为webapps的根路径/ reloadable:是否允许重新加载此context相关的web应用程序的类。
配置文件中的Host项目格式 <host name> 为开头 <Contet……../> 配置如何连接OST的运行环境位置(指向web) </host> 表示该项目的结尾
备份配置文件
3、 关闭和开启tomcat服务
4、虚拟机验证
五、Tomcat优化
默认安装下的缺省配置并不适合生产环境,它可能会频繁出现假死现象需要重启,只有通过不断压测优化才能让他最高效率稳定的运行,优化主要包括三方面,分别为操作系统优化(内核优化),Tomcat配置文件参数优化,Java虚拟机调优。
优化的配置文件为:/usr/local/tomcat/conf/server.conf ,优化的方向为Connector容器。
1、常用的优化相关参数如下Tomcat配置文件参数
【maxThreads】:Tomcat使用线程来处理接收的每个请求,这个值表示Tomcat可以创建的最大的线程数,默认值为200。
【minSpareThreads】:最小空闲线程数。启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是10.
【maxSpareThreads】:最大备用线程数,一旦创建的线程超过这个值,Tomcat就会关闭不再需要的socket线程。默认值是-1(无限制),一般不需要指定。
【URIEncoding】:指定Tomcat容器的URL编码格式,语言编码格式这块倒不如其它Web服务器软件配置方便,需要分别指定。
【connectionTimeout】:网络连接超时,单位:毫秒,设置为0表示用不超时,这样设置有隐患的,通常默认20000毫秒就可以。
【enableLookups】:是否反查域名,以返回远程主机的主机名,取值为true或false,如果设置为false,则直接返回IP地址,为了提高处理能力,应设置false。
【disabkeUploadTimeout】:上传是否使用超时机制,应设置为true
【connectionUploadTimeout】:上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个格局你自己的业务需要自己挑,以使servlet有较长的时间来完成它的执行,需要与上一个参数一起配置使用才会生效。
【accpetCount】:指定所有可用使用的处理请求的线程数都被使用时,可传入连接请求的最大列长度,超过这个数的请求将不予处理,你默认为100个。
【compression】:是否对相应的数据进行GZIP压缩,off:表示进制压缩,on:表示允许压缩(文本将被压缩),force:表示所有情况下都进行压缩,默认值为0ff,压缩数据可以有效的减少压面的大小,一般可以减小1/3左右,节省带宽。
【compressionMinSize】:表示压缩相应最小值,只有当相应报文大小大于这个值的时候,才会对报文进行压缩,如果开启压缩功能,默认值就是2048.
【compressableMimeType】:压缩类型,指定堆哪些类型的文件进行数据压缩
【noCompressionUserAgents=“gozilla,traviata”】:对于以下浏览器,不启用压缩。
2、优化配置
vim /usr/local/tomcat/conf/server.xml #71行添加 minSpareThreads="50" #最小空闲线程数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"/>
总结
Tomcat可做为运行JAVA代码的环境,只要把java源码(.class可执行的类文件)或者war包或jar包放在/webapps中,那么Tomcat启动时,就可以解压,并运行放在/webapps中的这些应用(只需要修改配置文件:server.xml)
1、tomcat 组件有哪些,从进入到处理 server: server元素在最顶层,代表整个Tomca容器,因此它必须是server.xml中唯一一个最外层的元素。一个server元素中可以有一个或多个service元素。server的主要任务,就是提供一个接口让客户端能够访问到这个service集合。同时维护它所有的service的声明周期,包括如何初始化,如何结束服务,如何找到客户端要访问的service。
service: service的作用,是在connector和engine外面报了一层,把他们组装在一起,对外提供服务,一个service可以包含多个connector,但是只能包含一个engine,其中connector的作用是从客户端接收请求,engine的作用是处理接收进行的请求,Tomcat可以提供多个service,不同的service监听不同的端口。
connector : 连接器,coyo http/1.1 8080 端口
engine: 容器引擎,容器引擎是管理运行容器的一个核心组件(container:web容器、jsp容器、servlet容器)
Host: 需要和java运行环境进行对接—》通过context连接java运行环境
context: Context元素代表在特定虚拟主机上运行的一个Web应用。每个Web应用基于WAR文件,或WAR文件解压后对应的目录(这里称为应用目录)。Context是Host的子容器,每个Host中可以定义任意多的Context元素。
servlet: 管理调用以及运行java代码的核心组件
2、Tomcat虚拟主机 在service.xml 中进行配置,只需要对应配置 <Context …/> 这段就可以了,此配置用于定于Tomcat 如何管理JAVA应用+如何对接、连接java应用。
3、Tomcat优化 ①配置文件中的优化:我们会在connector 连接配置端中进行优化,而优化的内容包括:如何更好的等待请求,如何分配线程资源、内存资源、队列、连接数、超时时间。启动时间优化(启动时间优化是优化jdk优化。进入/var/java/jdk-xxxxx/securty/java.securty 启动线程/dev/random ->/dev/urandom 的优化)
②JVM优化:-Xms -Xmx 的优化—》表示的意思是最小/最大的内存优化—–》简单理解为-Xms -Xmx 就是对应用使用的内存资源最小、最大值的优化。
③GC垃圾回收优化—》是因为java应用在Tomcat时,当应用运行的线程、进程资源退出时,会遗留一些资源碎片,GC就是对于这些资源碎片进行指定回收用的。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/290960.html