Tomcat服务器是一个免费的开源web应用服务器,属于轻量级应用服务器,在中小型系统和并发用户不是不少的场合中被广泛使用,是开发和测试JSP程序的首选。通常来讲,Tomcat虽然和apache或者Nginx这些web服务器同样,具备处理HTML页面的功能,然而因为其处理静态页面的能力远不如apache或者Nginx,因此Tomcat通常是做为一个servlet和JSP容器,单独运行在后端。java
关于Tomcat的目录及配置文件详解可参考官网:https://tomcat.apache.org/node
1、部署Tomcat
准备工做:linux
• centos7.3服务器一台
• 下载所需用到的软件包:https://pan.baidu.com/s/1Meys8bsvBsdwVUYak9srKQ
• 提取码:5bicweb
一、开始部署:shell
[root@tomcat /]# rpm -qa | grep jdk # 检测rpm安装的jdk环境 copy-jdk-configs-1.2-1.el7.noarch java-1.8.0-openjdk-headless-1.8.0.102-4.b14.el7.x86_64 java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64 java-1.7.0-openjdk-1.7.0.111-2.6.7.8.el7.x86_64 java-1.7.0-openjdk-headless-1.7.0.111-2.6.7.8.el7.x86_64 # 将带有headless的软件包卸载掉 [root@tomcat /]# rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.102-4.b14.el7.x86_64 # 将两个版本都卸载 [root@tomcat /]# rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.111-2.6.7.8.el7.x86_64 [root@tomcat /]# mkdir tomcat [root@tomcat /]# cd tomcat/ [root@tomcat tomcat]# rz # xshell环境直接上传所需软件包 [root@tomcat tomcat]# ls apache-tomcat-8.5.35.tar.gz jdk-8u211-linux-x64.tar.gz tomcat 监控页面.txt [root@tomcat tomcat]# tar zxf jdk-8u211-linux-x64.tar.gz -C /usr/local/ # 将jdk软件包解压到指定目录 [root@tomcat tomcat]# tar zxf apache-tomcat-8.5.35.tar.gz # 解压Tomcat源码包 [root@tomcat tomcat]# mv apache-tomcat-8.5.35 /usr/local/tomcat # 移动Tomcat至指定路径并修改目录名为Tomcat [root@tomcat tomcat]# vim /etc/profile # 编辑环境变量,在文件末尾添加以下几行 ............. // 省略部份内容 export JAVA_HOME=/usr/local/jdk1.8.0_211 export JRE_HOME=/usr/local/jdk1.8.0_211/jre export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH [root@tomcat tomcat]# . /etc/profile # 执行使之生效 [root@tomcat /]# java -version # 查看Java版本,确保已经安装成功 java version "1.8.0_211" Java(TM) SE Runtime Environment (build 1.8.0_211-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode) [root@tomcat /]# /usr/local/tomcat/bin/startup.sh # 启动Tomcat服务 Using CATALINA_BASE: /usr/local/tomcat Using CATALINA_HOME: /usr/local/tomcat Using CATALINA_TMPDIR: /usr/local/tomcat/temp Using JRE_HOME: /usr/local/jdk1.8.0_211/jre Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar Tomcat started. [root@tomcat /]# netstat -anput | grep 8080 # 查看端口是否正常监听 tcp6 0 0 :::8080 :::* LISTEN 3712/java
可使用客户端访问Tomcat服务器IP+8080端口,能够看到如下页面:apache
2、定义Tomcat多实例
所谓多实例,就是在一台服务器上运行多个Tomcat服务,因此,须要注意,在定义Tomcat的多实例时,千万不要出现端口冲突的状况编程
[root@tomcat local]# cp -r tomcat tomcat2 # 将Tomcat 复制一份 [root@tomcat local]# vim tomcat2/conf/server.xml # 编辑复制的Tomcat主配置文件 #配置文件的全部端口号,除了带注释的外,都须要修改, #只要配置项中带有“port”的,而且后面是数字的,都是端口号 #可自行根据状况进行更改 [root@tomcat local]# /usr/local/tomcat2/bin/startup.sh # 启动复制版Tomcat Using CATALINA_BASE: /usr/local/tomcat2 Using CATALINA_HOME: /usr/local/tomcat2 Using CATALINA_TMPDIR: /usr/local/tomcat2/temp Using JRE_HOME: /usr/local/jdk1.8.0_211/jre Using CLASSPATH: /usr/local/tomcat2/bin/bootstrap.jar:/usr/local/tomcat2/bin/tomcat-juli.jar Tomcat started. [root@tomcat local]# netstat -anput | grep 8081 # 看到已经开始监听 tcp6 0 0 :::8081 :::* LISTEN 3936/java
可使用客户端访问Tomcat服务器IP+8081端口,能够看到如下页面(因为是彻底复制以前的Tomcat目录,因此看到的页面同样):
3、配置Tomcat自定义目录bootstrap
[root@tomcat /]# mkdir -p /data/project # 建立自定义网站根目录 [root@tomcat /]# echo aaa > /data/project/index1.jsp # 编辑两个测试网页 [root@tomcat /]# echo bbb > /data/project/index2.jsp [root@tomcat /]# vim /usr/local/tomcat/conf/server.xml # 编辑主配置文件 ......................... // 省略部份内容 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> .................. # 找到Host元素,添加以下内容 <Context path = "/shop" docBase="/data/project" debug="0" reloadable="false" crossContext="true"> </Context> </Host> #上述的 <Context....> </Context>标签的另外一种写法就是<Context......./> #在上述添加的配置解释以下: #Path:指出客户端访问的路径; #docBase:指定网页的存放路径; #Debug:指定debug的等级为0,输出信息最少,9提供最多的信息; #reloadable:为true时表示当web.xml文件有改动的时候自动加载,没必要重启服务; #CorssContext:为true时,表示不一样的context共享一个session(会话池); [root@tomcat /]# /usr/local/tomcat/bin/shutdown.sh # 执行此两条命令,重启服务使配置生效 [root@tomcat /]# /usr/local/tomcat/bin/startup.sh
访问https://192.168.171.134:8080/shop/index1.jsp 验证
访问https://192.168.171.134:8080/shop/index2.jsp 验证vim
4、开启Tomcat目录遍历
在apache或Nginx中,它们的目录遍历是默认开启的,而Tomcat服务,它的目录遍历默认是关闭的,有些状况下,咱们须要开启它的目录遍历功能
直接访问192.168.171.134:8080/shop/进行测试,会报错404:
开启tomcat的遍历功能:后端
[root@tomcat /]# vim /usr/local/tomcat/conf/web.xml ................... //省略部份内容 <init-param> <param-name>listings</param-name> <param-value>true</param-value> # 搜索false,找到此行,false修改成true便可 </init-param> [root@tomcat /]# /usr/local/tomcat/bin/shutdown.sh # 重启tomcat使配置生效 [root@tomcat /]# /usr/local/tomcat/bin/startup.sh
从新访问192.168.171.134:8080/shop/ 进行测试:
5、Tomcat配置https
[root@tomcat /]# keytool -genkey -v -alias tomcat -keyalg RSA -keystore /usr/local/tomcat/conf/tomcat.eystore -validity 36500 # 获取证书 Enter keystore password: # 填写密钥 Re-enter new password: What is your first and last name? # 你的姓和名是什么? [Unknown]: zyz What is the name of your organizational unit? # 你组织单位名称是什么? [Unknown]: hh What is the name of your organization? # 您的组织名称是什么? [Unknown]: test What is the name of your City or Locality? # 你的城市或地区的名字是什么? [Unknown]: bj What is the name of your State or Province? # 你的州或省的名字是什么? [Unknown]: bj What is the two-letter country code for this unit? # 这个单位的国家代号是什么? [Unknown]: cn Is CN=zyz, OU=, O=test, L=bj, ST=bj, C=cn correct? # 是否肯定? [no]: y Generating 2,048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 36,50 days for: CN=zyz, OU=, O=test, L=bj, ST=bj, C=cn Enter key password for <tomcat> (RETURN if same as keystore password): # 直接回车便可 [Storing /usr/local/tomcat/conf/tomcat.keystore] [root@tomcat /]# vim /usr/local/tomcat/conf/server.xml ................ // 省略部份内容 #在service元素中添加以下内容 <Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" keystoreFile="/usr/local/tomcat/conf/tomcat.keystore" # 指定文件存放位置 keystorePass="123.com" > # 指定密钥 </Connector> [root@tomcat /]# /usr/local/tomcat/bin/shutdown.sh # 重启服务使配置生效 [root@tomcat /]# /usr/local/tomcat/bin/startup.sh [root@tomcat /]# netstat -anput | grep 443 # 查看端口是否监听 tcp6 0 0 :::443 :::* LISTEN 4795/java
访问https://192.168.171.134 进行验证:
6、使用Tomcat实时监控JVM虚拟机资源使用状况
[root@tomcat /]# vim /usr/local/tomcat/conf/server.xml <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path = "/shop" docBase="/data/project" debug="0" reloadable="false" crossContext="true"> # zai host元素中添加以下内容 </Context> <Context path = "/jiankong" docBase="/data/jiankong" debug="0" reloadable="flase" crossContext="true"/> </Host> [root@tomcat /]# mkdir -p /data/jiankong # 建立测试网站根目录 [root@tomcat /]# vim /data/jiankong/index.jsp # 编辑测试文件 <% Runtime rtm = Runtime.getRuntime(); long mm = rtm.maxMemory()/1024/1024; long tm = rtm.totalMemory()/1024/1024; long fm = rtm.freeMemory()/1024/1024; out.println("JVM memory detail info :<br>"); out.println("Max memory:"+mm+"MB"+"<br>"); out.println("Total memory: "+tm+"MB"+"<br>"); out.println("Free memory: "+fm+"MB"+"<br>"); out.println("Available memmory can be used is :"+(mm+fm-tm)+"MB"+"<br>"); %> [root@tomcat /]# /usr/local/tomcat/bin/shutdown.sh # 重启服务使配置生效 [root@tomcat /]# /usr/local/tomcat/bin/startup.sh
访问http://192.168.171.134:8080/jiankong/ 验证:
7、开启JMX远程调试功能
[root@tomcat /]# vim /usr/local/tomcat/bin/catalina.sh # 编辑此文件,跳转到306行 export JDK_JAVA_OPTIONS # 在此行下面添加以下内容 CATALINA_OPTS=" $CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true" [root@tomcat /]# cd /usr/local/jdk1.8.0_211/jre/lib/management/ [root@tomcat management]# cp jmxremote.password.template jmxremote.password [root@tomcat management]# vim jmxremote.password #跳转到最后一行添加以下内容 zyz 123.com #因为是只读文件,因此须要wq!强制保存退出 [root@tomcat management]# vim jmxremote.access #在最后一行添加以下内容 zyz readwrite \ create javax.management.monitor.*,javax.management.timer.* \ unregister [root@tomcat management]# chmod 600 jmxremote.password jmxremote.access #必须修改其权限为600,不然会失败 [root@tomcat management]# /usr/local/tomcat/bin/shutdown.sh # 重启服务使配置生效 [root@tomcat management]# /usr/local/tomcat/bin/startup.sh [root@tomcat /]# . /etc/profile # 执行刷新变量 [root@tomcat /]# jconsole # 执行此命令
验证其远程调试功能,因为其须要图形化的支持,因此须要进入其图形化桌面环境,下面的操做不能够在xshell上进行了:
而后点击以下:
而后就能够看到以下界面,显示JVM虚拟机的使用状况:
8、开启mangent管理页面
一、在访问Tomcat的默认界面时,有一个“Manager App”的框,以下:
二、点击进入后,会看到如下403报错页面,咱们须要复制它提示的代码:
此错误页面,已经将缘由及该如何配置写的明明白白的。
三、配置开启它的manager管理页面:
[root@tomcat /]# vim /usr/local/tomcat/conf/tomcat-users.xml #在末尾添加以下两行 <role rolename="manager-gui"/> <user username="tomcat" password="s3cret" roles="manager-gui"/> </tomcat-users> # 此行是结尾没必要写 [root@tomcat /]# vim /usr/local/tomcat/webapps/manager/META-INF/context.xml <Context antiResourceLocking="false" privileged="true" > <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.171.134|192.168.171.1|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> #在上面“allow=”后添加容许访问的IP,以管道符“ | ”为分割 <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/> </Context> [root@tomcat /]# /usr/local/tomcat/bin/shutdown.sh [root@tomcat /]# /usr/local/tomcat/bin/startup.sh
客户端验证:
从新点击,便可提示输入密码:
四、下拉页面,能够经过war包添加自定义的目录:
准备war包
[root@tomcat test]# cat index.jsp test test test test test test ................... [root@tomcat test]# jar -cvf test.war index.jsp added manifest adding: index.jsp(in = 80) (out= 10)(deflated 87%)
在web图形界面,添加war包:
客户端能够访问TomcatIP+8080端口+/test进行访问测试,其内容就是咱们作的war包中的内容,以下:
9、开启host-mangent管理页面
[root@tomcat /]# vim /usr/local/tomcat/conf/tomcat-users.xml .......... // 在末尾处添加以下两行 <role rolename="admin-gui"/> <user username="zyz" password="123.com" roles="admin-gui"/> </tomcat-users> [root@tomcat /]# vim /usr/local/tomcat/webapps/host-manager/META-INF/context.xml <Context antiResourceLocking="false" privileged="true" > <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="192.168.171.134|192.168.171.1|127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> 在allow后添加容许的IP,以“|”分隔开 <Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/> </Context>
客户端验证:
10、Tomcat的运行日志切割
cronolog是一个第三方的日志切割工具,比较方便快捷,是日志切割的一大利器。这里就使用这个第三方工具。
[root@tomcat tomcat]# tar zxf cronolog-1.6.2.tar.gz # 解包 [root@tomcat tomcat]# cd cronolog-1.6.2/ [root@tomcat cronolog-1.6.2]# ./configure && make && make install # 编译并安装 [root@tomcat cronolog-1.6.2]# which cronolog # 确保能够查到cronolog这个命令 /usr/local/sbin/cronolog [root@tomcat cronolog-1.6.2]# vim /usr/local/tomcat/bin/catalina.sh # 编辑此文件 搜索touch 并注释掉:# touch "$CATALINA_OUT" 跳转到470行左右修改 org.apache.catalina.startup.Bootstrap "$@" start 2>&1 | /usr/local/sbin/cronolog /usr/local/tomcat/logs/test.%Y-%m-%d.out >> /dev/null & 注释掉:# >> "$CATALINA_OUT" 2>&1 "&" [root@tomcat cronolog-1.6.2]# /usr/local/tomcat/bin/shutdown.sh # 重启验证 [root@tomcat cronolog-1.6.2]# /usr/local/tomcat/bin/startup.sh [root@tomcat logs]# ls # 确保有test.2020-01-12.out catalina.2020-01-12.log localhost.2020-01-12.log test.2020-01-12.out catalina.out localhost_access_log.2020-01-12.txt host-manager.2020-01-12.log manager.2020-01-12.log
11、定义Tomcat 404错误返回的页面
默认状况,客户端访问Tomcat服务器上一个不存在的目录时,会提示404错误,并且会将咱们Tomcat的版本信息等显示出来,这是咱们比较忌讳的,默认的404返回的错误页面以下:
解决办法就是,将404状态码进行重定向,以便咱们自定义返回的页面信息,以下:
[root@tomcat logs]# cat /usr/local/tomcat/webapps/ROOT/error.jsp Access Error... [root@tomcat logs]# vim /usr/local/tomcat/conf/web.xml version="3.1"> # 在22行附近添加以下内容 <error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page> [root@tomcat /]# /usr/local/tomcat/bin/shutdown.sh # 重启验证 [root@tomcat /]# /usr/local/tomcat/bin/startup.sh
再次访问一个不存在的页面进行验证:
12、Tomcat的内存优化
[root@tomcat ~]# vim /usr/local/tomcat/bin/catalina.sh #编辑此文件 #!/bin/sh #在第一行下面添加如下内容 JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms1023M -Xmx1024M -XX:NewSize=512M -XX:MaxNewSize=1020M -XX:NewRatio=2 -XX:ParallelGCThreads=15 -XX:+DisableExplicitGC" #添加完成后,保存退出后,重启Tomcat后,便可生效, #能够经过以前的实时监控JVM虚拟机资源使用进行查看验证 #如果在Tomcat 8.0以前的版本,还能够在上面添加如下两个配置项,8.0之后的版本就被移除了: #-XX:PermSize=256M #-XX:MaxPermSize=356M
添加的各个配置项解释以下:
-Xms:表示 JVM初始内存大小,也能够说是Java 初始化堆的大小,-Xms 与-Xmx 设成同样的值,避免 JVM 反复从新申请内存,致使性能大起大落,默认值为物理内存的 1/64
-Xmx:表示最大 Java 堆大小,当应用程序须要的内存超出堆的最大值时虚拟机就会提示内存溢出,而且致使应用服务崩溃,所以通常建议堆的最大值设置为可用内存的最大值的80%。
-Xmn:设置JVM最小内存(128-256就够了,通常不设置)
-XX:NewSize:设置新生代内存大小。 新生代,对象新建立的时候分配的内存空间,老生代在垃圾回收器回收事后该对象依然没有被回收,该对象就会移动到老生代
-XX:PermSize:设置持久代内存大小,用于存放静态文件,现在Java类、方法等。持久代对垃圾回收没有显著影响,可是有些应
用可能动态生成或者调用一些class,持久带也称为方法区,方法区存储每个java类的结构信息:好比运行时常量池,字段和方法数据,构造函数和普通方法的字节码内容以及类、实例、接口初始化时须要使用到的特殊方法等数据,JDK8中已经把持久代(PermGen Space) 干掉了,取而代之的元空间(Metaspace)。Metaspace占用的是本地内存,再也不占用虚拟机内存。
-XX:MaxPermSize:设置最大值持久代内存大小,永久代不属于堆内存,堆内存只包含新生代和老年代
-XX:NewRatio:改变新旧空间的比例,意思是新空间的尺寸是旧空间的1/8(默认为8)
-XX:ParallelGCThreads 可用来增长并行度,须要多cpu
-XX:+DisableExplicitGC:关闭System.gc(),简单理解就是关闭java中的内存回收机制
十3、Tomcat线程池的优化
[root@tomcat /]# vim /usr/local/tomcat/conf/server.xml # 编辑zh主配置文件 <Service name="Catalina"> # 在53行下面添加以下内容 <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThread="4"/> <Connector port="8080" protocol="HTTP/1.1" # 在69行下面添加以下内容 executor="tomcatThreadPool"
上述Excutor重要参数说明:
- name:共享线程池的名字,这是connector为了共享线程池要引用的名字,该名称必须惟一
- namePrefix:在JVM上,每运行线程均可以有一个name字符串,这一属性为线程池中每一个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀后面,默认值为tomcat-exec-
- maxThreads:该线程池能够容纳的最大线程数,默认200
- minSpareThreads:Tomcat应该始终打开的最小不活跃线程数,默认25
- Connector参数说明
- executor:表示使用参数值对应的线程池。
十4、修改Tomcat服务的请求方式
Tomcat支持的三种请求方式:BIO、NIO、APR。
- BIO:阻塞式I/O操做,Tomcat7如下版本默认状况下是以bio模式运行的,每一个请求都要建立一个线程来处理,线程开销比较大,不适用高并发的场景,性能也最低;
- NIO:基于缓冲区,能提供非阻塞I/O操做,和传统的BIO相比,具有更好的并发性能
- APR(Apache portable run-time libraries):简单理解,就是从操做系统级别解决异步IO问题,大幅度的提升服务器的处理和相应性能,也是Tomcat运行高并发的首选模式
APR提供的主要功能模块包括:内存分配及内存池、原子操做、文件I/O、锁、内存映射、哈希表、网络I/O、轮询、进程及线程操做等等,经过采用APR,Tomcat能够得到高度可扩展性以及优越的性能,而且能够更好的与本地服务器技术集成,从而可使Tomcat做为一款通用的Web服务器使用,而不只仅做为轻量级应用服务器。在这种状况下,Java将再也不是一门侧重于后端的编程语言,也能够更多的用于成熟的Web服务器平台。
一、更改其请求方式为NIO(注意:Tomcat8以上版本,默认使用的就是NIO模式,不须要额外修改 )
[root@tomcat /]# vim /usr/local/tomcat/conf/server.xml # 编辑zh主配置文件 <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" # 修改成nio executor="tomcatThreadPool" connectionTimeout="20000" redirectPort="8443" />
重启后,查看其“catalina.out”日志,有如下字样,则表示是在nio接收请求处理方式,以下(我这里在上面对catalina.out进行了日志切割,因此须要查看切割后的日志文件):
二、更改其请求方式为APR模式
启用这种模式稍微麻烦一些,须要安装一些依赖库,下面是基于centos 7.3环境的Tomcat/8.5.35进行配置。
安装apr动态库:
[root@tomcat /]# yum -y install apr-devel openssl-devel gcc make [root@tomcat /]# cd /usr/local/tomcat/bin/ [root@tomcat bin]# tar zxf tomcat-native.tar.gz [root@tomcat bin]# cd tomcat-native-1.2.18-src/native/ [root@tomcat native]# ./configure && make && make install #编译安装完成后,apr动态库默认安装在/usr/local/apr/lib目录下。
配置APR本地库到系统共享库搜索路径中:
设置LD_LIBRARY_PATH和LD_RUN_PATH环境变量,指向/usr/local/apr/lib目录,可配置到/etc/profile文件中。以下:
[root@tomcat native]# vim /etc/profile #编辑全局变量,在文件末尾写入如下两行 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/apr/lib export LD_RUN_PATH=$LD_RUN_PATH:/usr/local/apr/lib [root@tomcat native]# . /etc/profile #从新加载环境变量 #重启验证 [root@tomcat ~]# /usr/local/tomcat/bin/shutdown.sh [root@tomcat ~]# /usr/local/tomcat/bin/startup.sh [root@tomcat native]# vim /usr/local/tomcat/conf/server.xml <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" # xiugai修改成apr executor="tomcatThreadPool" connectionTimeout="20000" redirectPort="8443" />