TOMCAT

TOMCAT

Scroll Down

TOMCAT安装与配置

简介

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
在这里插入图片描述

Tomcat的层次结构

---》提供一个接口
---》接受请求connector 处理请求container
---》两个典型的connector 一个监听http请求8080(http1.1) 一个监听其他服务器的请求8009(ajp1.3)
---》配置多个虚拟机主机
---》每个虚拟主机下都可以部署(deploy)一个或者多个Web App(web应用)
---》一个Web App对应一个Context,有一个Context path





Container ==》 Engine/Host/Context

appBase

unpackWARs 如果应用目录有war包是否自动解压 true自动 false不解压
autoDeploy 如果应用目录有应用是否自动部署 true自动 false不部署
path 访问的时候要加的目录
docbase 网页文件的真实路径
debug 调试级别 (0-9,9为最高)
reloadable 当你修改了web.xml的配置文件是否需要重启 fasle表示需要重启 true表示不需要重启
crossContext 在tomcat集群里多个tomcat可以共享会话

实验准备

准备两台拥有jdk环境的主机

实验步骤

Tomcat的多实例

第一台

解压软件包

tar -zxvf apache-tomcat-8.5.35.tar.gz 

将软件包移动到别处

mv apache-tomcat-8.5.35/ /usr/local/tomcat
cp -r  /usr/local/{tomcat,tomcat1}

修改配置文件

vim /usr/local/tomcat1/conf/server.xml

搜索"8009"将其改为"8010",将"8443"改为"8444"

   <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8010" protocol="AJP/1.3" redirectPort="8444" />

搜索"8080"将其改为"8081",将"8443"改为"8444"

 <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8444" />

搜索"8005"将其改为"8006"

<Server port="8006" shutdown="SHUTDOWN">
/usr/local/tomcat/bin/startup.sh &> /dev/null
/usr/local/tomcat1/bin/startup.sh &> /dev/null

验证一下

firefox 192.168.50.108:8080
firefox 192.168.50.108:8081

停止tomcat1并且删除掉它

/usr/local/tomcat1/bin/shutdown.sh 
rm -rf /usr/local/tomcat1

修改配置文件

vi /usr/local/tomcat/conf/server.xml

150行:

<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="true">

自己添加:

<Context path="/shop" docBase="/data" debug="0" reloadable="fasle" crossContext="true">
</Context>
mkdir /data

写主页

echo "<h1>hello world</h1>" > /data/index.jsp

启动脚本

/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh

访问并验证

firefox http://192.168.50.108:8080/shop/index.jsp
firefox http://192.168.50.108:8080/shop

Tomcat的目录浏览功能

cd /data
mv index.jsp index1.jsp
mv /data/{index.jsp,index1.jsp}
touch /data/index{2..10}.jsp

修改配置文件

vi /usr/local/tomcat/conf/web.xml

修改112行:

 <init-param>
        <param-name>listings</param-name>
        <param-value>true</param-value>  //true开启目录浏览
    </init-param>

重启服务

/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
firefox http://192.168.50.108:8080/shop

这样就可以看到这个目录下的所有文件

Tomcat远程监控(jmx远程调用) 远程监控tomcat的状态

第一台:
开启jmx远程调用功能

vi /usr/local/tomcat/bin/catalina.sh

308行搜索"Execute",在Execute上面插入

CATALINA_OPTS="-Djava.rmi.server.hostname=192.168.50.108
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8080
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true"  #远程登陆的时候,需要通过本机授权

配置认证用户

cd /usr/local/jdk1.8.0_201/jre/lib/management/
cp jmxremote.password.template jmxremote.password
vi jmxremote.password

最后两行取消注释
将这两个用户的密码改为123456

 monitorRole  123456
 controlRole  123456
less jmxremote.access  (这个文件里指明刚刚两个用户所拥有的权限)
monitorRole   readonly
controlRole   readwrite \
              create javax.management.monitor.*,javax.management.timer.* \
              unregister
chmod 600 jmxremote.*

重启服务

/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh
第二台:
/usr/local/jdk1.8.0_201/bin/jconsole 

选择Remote Process 远程连接

192.168.50.108:8080
monitorRole 123456

会提示你是否要建立不安全的连接(使用http连接)
选择继续就可以在浏览器看到tomcat的监控信息

Tomcat app manager

只需要使用第一台

vi /usr/local/tomcat/bin/catalina.sh

搜索"Execute",在Execute上面插入
将刚刚添加远程监控的5行删除

vi /usr/local/tomcat/webapps/manager/META-INF/context.xml

<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="192.168.50.*" />   #写自己的网段
vi /usr/local/tomcat/conf/tomcat-users.xml

最后一行在前面""插入

  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <user username="manager" password="123456" roles="manager-gui"/>
  <user username="managerscript" password="123456" roles="manager-script"/>
</tomcat-users>
1.manager-gui    #允许访问html接口(允许访问/manager/heml/*)
2.manager-script #允许访问纯文本接口(/manager/text/*)
3.manager-jmx    #允许访问jmx代理接口(/manager/jmxproxy/*)
(前面三种角色都具有最后一种角色的权限)
4.manger-status  #允许访问Tomcat状态页面(/manager/status/*)

重启

/usr/local/tomcat/bin/shutdown.sh
/usr/local/tomcat/bin/startup.sh

验证

firefox http://192.168.50.108:8080/manager/html/
manager
123456

把bdqn.war这个包拖到root目录下
将这个war包自动发布
如果提示标签崩溃了,将firefox浏览器重装一下就好

host manager

查看tomcat的状态

firefox http://192.168.50.108:8080/manager/status  
vi /usr/local/tomcat/webapps/host-manager/META-INF/context.xml
<Context antiResourceLocking="false" privileged="true" >
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="^.*$" />   允许所有人来访问本地主机
  <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

添加一个用户

vi /usr/local/tomcat/conf/tomcat-users.xml
<role rolename="admin-gui"/>
  <role rolename="admin-script"/>
  <user username="admin" password="123456" roles="admin-gui"/>
  <user username="adminscript" password="123456" roles="admin-script"/>

重启

/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh
firefox http://192.168.50.108:8080/host-manager/html/

可以手动添加tomcat的虚拟主机

tomcat的优化

1.端口防护(设置成非8080端口)
2.禁用后台管理(rm -rf webapps目录下的/host-manager和/manger)
3.禁用目录浏览功能
4.隐藏信息(错误页面信息)

vi /usr/local/tomcat/conf/web.xml 

在23行插入

  <error-page>
  <error-code>404</error-code>
  <location>/notfound.jsp</location>
  </error-page>
vi /data/notfound.jsp
<h1>404</h1>

重启服务

/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh

输入错误界面验证

firefox http://192.168.50.108:8080/shop/sssss
JVM参数优化

JVM设置

在Tomcat中设置JVM参数 修改bin/catalina.sh文件设置参数(在第一行#!/bin/sh下写),增加

set JAVA_OPTS=-Dfile.encoding=UTF-8
-server 
-Xms1024M 
-Xmx1024M 
-XX:NewSize=512M 
-XX:MaxNewSize=1024M 
-XX:PermSize=256M
-XX:MaxPermSize=356M  
-XX:NewRatio=2
-XX:MaxTenuringThreshold=50
-XX:DisableExplicitGC 

参考下述建议,根据自身硬件情况和业务情况设定

详解 -server:一定要作为第一个参数,在多个 CPU 时性能佳,还有一种叫 -client 的模式,特点是启动速度比较快,但运行时性能和内存管理效率不高,通常用于客户端应用程序或开发调试,在 32 位环境下直接运行 Java 程序默认启用该模式。Server 模式的特点是启动速度比较慢,但运行时性能和内存管理效率很高,适用于生产环境,在具有 64 位能力的 JDK 环境下默认启用该模式。在Windows上,缺省的情况下默认是client模式,如果要使用server模式,需要在启动虚拟机时加-server参数,以获得高性能,对服务器应用,推荐采用server模式,尤其是多个CPU的系统。在Linux或者Solaris上缺省则采用server模式。

-Xms:表示 JVM初始内存大小,也可以说是Java 初始化堆的大小,-Xms 与-Xmx 设成一样的值,避免 JVM 反复重新申请内存,导致性能大起大落,默认值为物理内存的 1/64

-Xmx:表示最大 Java 堆大小,当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃,因此一般建议堆的最大值设置为可用内存的最大值的80%。如何知道我的 JVM 能够使用最大值,使用 java -Xmx512M -version 命令来进行测试,然后逐渐的增大 512 的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息,默认值为物理内存的

-Xmn:设置JVM最小内存(128-256就够了,一般不设置)

-XX:NewSize:设置新生代内存大小。

-XX:MaxNewSize:设置最大新生代新生代内存大小

-XX:PermSize:设置持久代内存大小

-XX:MaxPermSize:设置最大值持久代内存大小,永久代不属于堆内存,堆内存只包含新生代和老年代。

-XX:NewRatio:改变新旧空间的比例,意思是新空间的尺寸是旧空间的1/8(默认为8)

-XX:+UseParNewGC:对新生代采用多线程并行回收,这样收得快,注意最新的 JVM 版本,当使用 -XX:+UseConcMarkSweepGC 时,-XX:UseParNewGC 会自动开启。因此,如果年轻代的并行 GC 不想开启,可以通过设置 -XX:-UseParNewGC 来关掉。

-XX:SurvivorRatio:Eden 区与 Survivor 区的大小比值,设置为 8,表示 2 个 Survivor 区(JVM 堆内存年轻代中默认有 2 个大小相等的 Survivor 区)与 1 个 Eden 区的比值为 2:8,即 1 个 Survivor 区占整个年轻代大小的 1/10。

-XX:ConcGCThreads:早期 JVM 版本也叫-XX:ParallelCMSThreads,定义并发 CMS 过程运行时的线程数。比如 value=4 意味着 CMS 周期的所有阶段都以 4 个线程来执行。尽管更多的线程会加快并发 CMS 过程,但其也会带来额外的同步开销。因此,对于特定的应用程序,应该通过测试来判断增加 CMS 线程数是否真的能够带来性能的提升。如果还标志未设置,JVM 会根据并行收集器中的 -XX:ParallelGCThreads 参数的值来计算出默认的并行 CMS 线程数。

-XX:ParallelGCThreads:配置并行收集器的线程数,即:同时有多少个线程一起进行垃圾回收,此值建议配置与 CPU 数目相等。

-XX:OldSize:设置 JVM 启动分配的老年代内存大小,类似于新生代内存的初始大小 -XX:NewSize。

线程池设置

在Tomcat中,每一个用户请求都是 一个线程,所以可以使用线程池提高性能。 在配置文件server.xml的connector中引用,可以设置最大线程数为500,启动时最小线程为4,如下设置

在service标签下添加内容一个标签exector

      <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThread="4"/>
在connector标签的http1.1下边添加:
               executor="tomcatThreadPool"

在这里插入图片描述 Excutor重要参数说明:

name:共享线程池的名字,这是connector为了共享线程池要引用的名字,改名字必须唯一
namePrefix:在JVM上,每运行线程都可以有一个name字符串,这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀后面,默认值为tomcat-exec-
maxThreads:该线程池可以容纳的最大线程数,默认200
maxIdleTime:在Tomcat关闭一个空闲线程之前,允许空闲线程持续的时间(单位为毫秒)。只有当前活跃的线程数大于minSpareThread的值,才会关闭空闲进程,默认值60000,一分钟
minSpareThreads:Tomcat应该始终打开的最小不活跃线程数,默认25
threadPriority:线程的等级
Connector重要参数说明

executor:表示使用参数值对应的线程池
minProcessors:服务器启动时创建的处理请求的线程数
maxProcessors:最大可以创建的处理请求的进程数
acceptCount:指定当前所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求不予处理。