Tomcat部署与优化

举报
壮壮1356 发表于 2021/07/14 10:18:52 2021/07/14
【摘要】 tomcat概述:自2017年11月编程语言排行榜Java占比 13%,高居榜首,Tomcat也一度成为Java开发人员的首选。其开源、占用系统资源少、跨平台等特性被深受喜爱。本章主要学习如何部署Tomcat 服务,根据生产环境实现多个虚拟主机的配置,最后的重点是进行压测,根据压测结果如何优化 Tomcat服务及常见的内存溢出如何处理。tomcat简介:Tomcat是一款免费、开放源代码的w...

tomcat概述:
自2017年11月编程语言排行榜Java占比 13%,高居榜首,Tomcat也一度成为Java开发人员的首选。其开源、占用系统资源少、跨平台等特性被深受喜爱。本章主要学习如何部署Tomcat 服务,根据生产环境实现多个虚拟主机的配置,最后的重点是进行压测,根据压测结果如何优化 Tomcat服务及常见的内存溢出如何处理。

tomcat简介:
Tomcat是一款免费、开放源代码的web应用服务器,是Apache软件基金会的一个核心开源项目,属于轻量级应用服务器,PS: Apache: Apache软件基金会(也就是Apache Software Foundation,简称为ASF),是专门为支持开源软件项目而办的一个非盈利性组织官网为: https: //tomcat.apache.org/

tomcat核心组件:
通常意义上的web 服务器接受请求后,只是单纯地响应静态资源,如HTML,文件,图片文件等,不能在后端进行一定的处理操作。Tomcat是 Apache 下的一个子项目,它具备 web服务器的所有功能,不仅可以监听接受请求并响应静态资源,而且可以在后端运行特定规范的Java 代码Servlet,同时将执行的结果以HTML代码的形式写回客户端。
它的核心组件一共三个:
1、Web容器:完成Web服务器的功能,负责web服务的tcp/ip/http等协议响应、处理(nginx处理静态页面的应用交互)
2、servlet容器:由名称为catalina的脚本来处理Servlet代码(例如具体的某个任务,从数据库中拿取数据给与前端),主要处理后端逻辑业务例如与数据库交互,加密,支付宝等等),catalina实际处理的是servlet代码,而servlet代码是由JAVA编写的。
3、JSP容器:tomcat中作为java前端展示的一个组件index.jsp
是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头 以%>结束。JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。
JSP通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页。

用于将JSP动态网页翻译成Servlet代码
容器内提供了多个以index.jsp为结尾的JAVA前端页面展示,而index.jsp中由很多HTML标签,HTM标签中会嵌套很多JRVA代码,这些JAVA代码,最终会被翻译为servlet 代码,(而本身JSP容器不具备解析与分析代码的功能,所以会给交给servlet容器)

Tomcat处理请求过程
用户请求—》service(支撑tomcat的服务进程)
1、用户点击网页内容,请求被发送到本机端口8080,被在那里监听的coyote (Tomcat连接器框架/基础环境HTTP/1.1 Connector(连接器,用于对接请求)获得。
2、接受请求之后交给container(容器)中的engine进行处理,engine(引擎)是做为容器运行的动力核心
3、基于引擎支撑,容器中会跑很多host虚拟主机,这些虚拟主机中也会有很多context(当前程序所处的环境),此处的context功能可以理解为:将JAVA前端和JAVA后端连接的展示的枢纽
4、servlet处理完后会返回给context
5、context返回给engine引擎
6、engine返回给端口
7、端口最后将页面展现给用户
在这里插入图片描述

tomcat部署及管理

环境变量:PATH
用户环境变量:只针对用户生效
系统环境变量:只针对主机生效bin目录

1、下载并并安装JDK(jdk可以把源码文件转化为执行文件)
2、环境部署将tomcat所需两个软件包传到opt目录下(jdk-8u201-linux-x64.rpm和apache-tomcat-9.0.16.tar.gz)
安装jdk
查看当前系统下的java版本
[root@localhost opt]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
安装jdk
[root@localhost opt]# rpm -ivh jdk-8u201-linux-x64.rpm
设置环境jdk环境变量
[root@localhost opt]# cd /etc/profile.d/
[root@localhost profile.d]# 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        #可执行文件的位置
保存退出
[root@localhost profile.d]# source /etc/profile.d/java.sh   #加载生效
[root@localhost profile.d]# 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)
环境参数解释
CLASSPATH:编译、运行Java程序时(tomcat),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文件。
3、安装启动tomcat
[root@localhost opt]# tar zxvf apache-tomcat-9.0.16.tar.gz -C /usr/local/
[root@localhost opt]# cd /usr/local/
[root@localhost local]# ls
apache-tomcat-9.0.16  etc    include  lib64    nginx  share
bin                   games  lib      libexec  sbin   src
[root@localhost local]# cd apache-tomcat-9.0.16/
[root@localhost apache-tomcat-9.0.16]# ls   查看目录文件
bin           conf             lib      logs    README.md      RUNNING.txt  webapps
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  RELEASE-NOTES  temp     work
优化启动tomcat
[root@localhost bin]# ln -s /usr/local/tomcat/bin/startup.sh /usr/local/bin/
[root@localhost bin]# ln -s /usr/local/tomcat/bin/shutdown.sh /usr/local/bin/
[root@localhost bin]# ./startup.sh
Using CATALINA_BASE:   /usr/local/apache-tomcat-9.0.16
Using CATALINA_HOME:   /usr/local/apache-tomcat-9.0.16
Using CATALINA_TMPDIR: /usr/local/apache-tomcat-9.0.16/temp
Using JRE_HOME:        /usr/java/jdk1.8.0_201-amd64
Using CLASSPATH:       /usr/local/apache-tomcat-9.0.16/bin/bootstrap.jar:/usr/local/apache-tomcat-9.0.16/bin/tomcat-juli.jar
Tomcat started.
[root@localhost bin]# netstat -antp | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      82970/java  

在这里插入图片描述

主要目录解释
bin :存放启动和关闭Tomcat的脚本文件,比较常用的是catalina,sh、startup.sh、shutdown.sh 三个文件
conf :存放Tomcat服务器的各种配置文件,比较常用的是server. xml、context . xml、tomcat-users.xml、web. xml四个文件.
lib :存放Tomcat服务器的jar包,一般不作任何改动,除非连接第三方服务,比如redis,那就需要添加相对应的jar包
logs :存放Tomcat白志
temp :存放Tomcat运行时产生的文件
webapps :存放项目资源的目录
work:Tomcat工作目录,一般清除Tomcat缓存的时候会使用到
[root@localhost local]# vim /usr/java/jdk1.8.0_201-amd64/jre/lib/security/java.security
securerandom.source=file:/dev/urandom  #修改117行(/dev/random和/dev/urandom都是伪终端,但是/dev/urandom提供的数据流更快)
保存退出重启
[root@localhost local]# shutdown.sh
[root@localhost local]# startup.sh
打开主配置文件
[root@localhost conf]# vim /usr/local/tomcat/conf/server.xml
搜索8080端口
 69     <Connector port="8080" protocol="HTTP/1.1"   
 70                connectionTimeout="20000"      #毫秒
 71                redirectPort="8443" />      #SSL重定向/映射443(https)

tomcat虚拟主机配置
概述:很多时候公司会有多个项目需要运行,那么肯定不可能是一台服务器上运行多个Tomcat服务,这样会消耗太多的系统资源。此时,就需要使用到Tomcat虚拟主机。例如现在新增两个域名 www. kgc .com和www.benet.com ,希望通过这两个域名访问到不同的项目内容。

1、创建kgc和benet项目目录和文件
首先添加地址映射
[root@localhost conf]# vim /etc/hosts
192.168.153.215 www.kgc.com www.benet.com
[root@localhost conf]# mkdir /usr/local/tomcat/webapps/kgc
[root@localhost conf]# mkdir /usr/local/tomcat/webapps/benet
[root@localhost tomcat]# cd webapps/
[root@localhost webapps]# cd kgc/
[root@localhost kgc]# echo "this is kgc page\!" > /usr/local/tomcat/webapps/kgc/index.jsp
[root@localhost webapps]# cd benet/
[root@localhost benet]# echo "this is kgc page\!" > /usr/local/tomcat/webapps/benet/index.jsp

2、修改tomcat主配置文件
[root@localhost conf]# vim /usr/local/tomcat/conf/server.xml
找到148行的<Host name="localhost"  appBase="webapps"
              unpackWARs="true" autoDeploy="true">
复制这两行至164行</host>下面,然后对他做出修改
 <Host name="www.kgc.com"  appBase="webapps" unpackWARs="true" autoDeploy="true"     xmlValidation="flase" xmlNamespaceAware="false">
 添加此内容
<Context docBase="/usr/local/tomcat/webapps/kgc" path="" reloadable="true" />
     </Host>
添加此内容
<Host name="www.benet.com"  appBase="webapps" unpackWARs="true" autoDeploy="true"         xmlValidation="flase" xmlNamespaceAware="false">
        <Context docBase="/usr/local/tomcat/webapps/benet" path="" reloadable="true" />
       </Host>
保存退出
关闭开启
[root@localhost conf]# shutdown.sh
[root@localhost conf]# startup.sh
访问153.215:8080

在这里插入图片描述
在这里插入图片描述

配置解释
Host name : 主机名
appBase : Tomcat程序工作目录,相对路径为webapps,绝对路径为/usr/local/tomcat/webapps
unpackWARs :tomcat在webapps文件夹中发现war文件时,是否自动将其解压
autoDeploy :设为true,则web.xml发生变化时,tomcat自动重新部署程序。实现这个功能必需允许后台处理
xmlValidation :是否开启对XML文件的验证
xmlNamespaceAware :是否启用xml命名空间,设置该值与xmlValidation为true,表示对web .xml文件执行有效性检验
docBase : WEB应用的目录(本地路径)
path:设置访问的URI为wEB应用的根目录(URL路径) , ""表示默认,加载系统中自带的类(class文件)
reloadable :是否在程序有改动时重新载入

tomcat优化
概述:默认安装下的缺省配置并不适合生产环境,它可能会频繁出现假死现象需要重启,只有通过不断压测优化才能让它最高效率稳定的运行。优化主要包括三方面,分别为操作系统优化(内核参数优化),Tomcat配置文件参数优化,Java虚拟机(JVM)调优。

优化方向:
1、服务本身的(系统五大负载+内核优化>
2、配置文件( nginx压缩、防盗链、版本隐藏、缓存、)
3、第三方工具(ab铺助测试服务/服务器的健壮性)

tomcat配置文件参数优化

常用优化参数解释:
【maxThreads 】 Tomcat使用线程来处理接收的每个请求,这个值表示Tomcat 可创建的最大的线程数,默认值是200。
【minspareThreads 】最小空闲线程数,Tomcat
启动时的初始化的线程数,表示即使没有人使用也开这么多空线程等待,默认值是10。
【maxSpareThreads 】最大备用线程数,一旦创建的线程超过这个值,Tomcat 就会关闭不再需要的socket线程。默认值是-1(无限制)。一般情况不需要指定。
【URIEncoding 】指定Tomcat 容器的URL编码格式,语言编码格式这块倒不如其它 web服务器软件配置方便,需要分别指定。
【connnectionTimeout 】网络连接超时,单位:毫秒,设置为0表示永不超时,这样设置有隐患的。通常默认20000毫秒就可以。
【enableLookups 】是否反查域名,以返回远程主机的主机名,取值为: true 或false,如果设置为false,则直接返回IP地址,为了提高处理能力,应设置为false。
【disableUploadTimeout 】 上传时是否使用超时机制。应设置为true。
【connectionUploadTimeout】上传超时时间,毕竟文件上传可能需要消耗更多的时间,这个根据你自己的业务需要自己调,以使 Servlet有较长的时间来完成它的执行,需要与上一个参数一起配合使用才会生效。
【acceptcount】指定当所有可以使用的处理请求的线程数都被使用时,可传入连接请求的最大队列长度,超过这个数的请求将不予处理,默认为100个。
【compression 】是否对响应的数据进行GZIP压缩,off:表示禁止压缩; on:表示允许压缩
(文本将被压缩)、force:表示所有情况下都进行压缩,默认值为off,压缩数据后可以有效的减少页面的大小,一般可以减小1/3左右,节省带宽。
【compressionMinSize】表示压缩响应的最小值,只有当响应报文大小大于这个值的时候才会对报文进行压缩,如果开启了压缩功能,默认值就是2048
【compressableMimeType 】压缩类型,指定对哪些类型的文件进行数据压缩。
【noCompressionUserAgents="gozilla,traviata”】对于以下的浏览器,不启用压缩
[root@localhost ~]# vim /usr/local/tomcat/conf/server.xml
在77-88行之间添加如下内容
74     <Connector executor="tomcatThreadPool"
 75                port="8080" protocol="HTTP/1.1"
 76                connectionTimeout="20000"
 77                redirectPort="8443" 
 78 minSpareThreads="50"
 79 enableLookups="false"         是否开启检测
 80 disableUploadTimeout="true"    超时机制是否开启
 81 acceptCount="300"              队列
 82 maxThreads="500"             最大工作线程
 83 processorCache="500"          系统可以缓存对象的数量
 84 URIEncoding="UTF-8"        字符集
 85 compression="on"           压缩
 86 compressionMinSize="2048"   压缩最小单元
 87 compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,image/g    if,image/jpg,image/png"   #压缩支持类型
 88 />
保存退出,关闭开启
[root@localhost ~]# cd /usr/local/tomcat/bin
[root@localhost bin]# shutdown.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/jdk1.8.0_201-amd64
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@localhost bin]# startup.sh
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/jdk1.8.0_201-amd64
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

nginx+tomcat反向代理
概述:以LNMP为例,一个企业内部最基础的架构组成需要一个处理静态web服务的页面,一个动态Web服务的页面和数据库而我们实现了在Linux平台上.实现了Nginx + PHP 实现动静分离,而实际生产中往往一台nginx
需要"对应"多个动态处理的服务(及tomcat),所以如何将前端接收到的动态请求转交给后端多个tomcat处理,是我们此处研究的内容

操作步骤:
环境:两台tomcat 一台nginx
nginx:192.168.153.220
tomcat1:192.168.153.200
tomcat2:192.168.153.215

tomcat基本配置完成之后配置动静分离

在153.200配置
[root@localhost usr]# mkdir /usr/local/tomcat/webapps/test
[root@localhost usr]# cd /usr/local/tomcat/webapps/test
[root@localhost usr]# cd /usr/local/tomcat/webapps/test
[root@localhost test]# vim index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html> 
[root@localhost conf]# vim server.xml
148       <Host name="localhost"  appBase="webapps"
149             unpackWARs="true" autoDeploy="true">
150       <Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />          #149行后面添加改行内容
[root@localhost test]# shutdown.sh
[root@localhost test]# startup.sh
[root@localhost test]# curl 192.168.153.200:8080/index.jsp

<html>
<head>
<title>JSP test1 page</title>
</head>
<body>
动态页面 1,http://www.test1.com

</body>
</html> 

在tomcat2:153.215配置
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html> 
[root@localhost conf]# vim server.xml
148       <Host name="localhost"  appBase="webapps"
149             unpackWARs="true" autoDeploy="true">
150       <Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true" />          #149行后面添加改行内容
[root@localhost test]# shutdown.sh
[root@localhost test]# startup.sh
[root@localhost conf]# curl 192.168.153.215:8080/index.jsp

<html>
<head>
<title>JSP test2 page</title>
</head>
<body>
动态页面 2,http://www.test2.com

</body>
</html>
在nginx153.220配置
准备静态页面
echo '<html><body><h1>this is static</h1></body></html>' >/usr/local/nginx/html/index.html
[root@localhost conf]# vim nginx.conf
 33     #gzip  on;
 添加三行内容(配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大)
 34     upstream tomcat_server {
 35       server 192.168.153.200:8080 weight=1;
 36       server 192.168.153.215:8080 weight=1;
 37      } 
 42         #charset koi8-r;   
 43         #access_log  logs/host.access.log  main;
 添加六行内容(配置Nginx处理动态页面请求,将﹒jsp文件请求转发到Tomcat服务器处理)       
 44         location ~ .*\.jsp$ {
 45           proxy_pass http://tomcat_server;
 46           proxy_set_header HOST $host;
 47           proxy_set_header X-Real-IP $remote_addr;
 48           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 49 }       
[root@localhost conf]# systemctl restart nginx
mginx机访问153.220/index.jsp会出现轮询界面

在这里插入图片描述

原文链接:https://blog.csdn.net/weixin_56665913/article/details/118413194

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200