1,Tomcat介绍

Tomcat是apache软件基金会项目中的一个核心项目,有apache和sun其他一些公司及个人共同开发而成的。
Tomcat服务器是一个免费的开源的web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不多的场合下被普遍使用,是开发和调试jsp程序的首选。
可以这样认为,当一台服务器配置好apache服务器以后,可以利用apache服务器来响应我们的html页面的访问请求,而tomcat是apache服务器的扩展,当你运行tomcat的时候实际上是作为一个apache独立的进程单独运行的,apache服务器为html页面提供服务的,而tomcat是运行jsp页面和servlet,另外tomcat也能具有处理html页面的功能,但是处理静态的能力没有apache处理好。

jsp:java服务器页面,是一个简化的servlet设计,在传统的html页面里面增加了java代码; jsp=“html+java代码+jsp标签”

2,tomcat组件

servlet(应用程序或者容器)是java提供的用于开发web服务器应用程序的一个组件,运行在服务器端,有servlet用于生成动态页面内容,servlet是平台读立的java类,编写一个servlet,实际上就是安装servlet规范编写一个java类。
2.1,什么是servlet?
tomcat处理请求和响应的过程是由servlet的程序来完成的,并且servlet是为解决实现动态页面而衍生的东西,与我们之前了解的lnmp环境想要实现动态页面需要和php服务器沟通的过程差不多,可以把servlet比作成php

tomcat是web应用服务器,是一个servlet/jsp容器,tomcat作为servlet容器,负责处理客户请求,并将servlet的响应传送给客户,而servlet是一种运行在java语言的服务器上的组件,servlet最常见的用途是扩展java web服务器功能,提供非常安全的,可移植的(打包网页代码就可以在另外一个环境中与运行,如果linux环境跟windows环境),易于使用cgi替代品。
2.2,tomcat处理数据的流程

1)客户端通过浏览器发送请求数据
2)tomcat收到服务器的请求数据,由servlet容器处理并进行解析,并且把客户端的数据请求request改变成servlet request交给后端的servlet实例,实例收到客户端的请求数据的请求对象后,进行处理客户端的请求,处理完成后将数据响应给servlet容器,响应给servlet容器(servlet response)。
3)servlet收到实例的响应数据后交给客户端。
servlet容器与servlet实例需要通过java servlet api接口进行通信,api接口是由开发人员在写代码的时候定义或者编写。
2.3,servlet和jsp的区别
1)Servlet在Java代码中可以通过HttpServletResponse对象动态输出HTML内容。
2)JSP是在静态HTML内容中嵌入Java代码,然后Java代码在被动态执行后生成HTML内容。

3,tomcat的特点

运行时占用的资源小,扩展性好,支持负载均衡和邮件服务器等开发应用系统常用的功能。

4,安装tomcat

在安装tomcat之前必须先安装JDK,JDK是sun公司免费提供的java语言的软件开发工具包,其中包含java虚拟机(JVM),编写好的java源程序经过编译可形成java字节码,只要安装了JDK,就可以利用JVM解释这些字节码文件,从而保证了java的平台性。
jdk下载地址:https://www.oracle.com/java/technologies/javase-downloads.html
1)安装JDK,配置java环境

#查看系统中是否有老版本的java环境,如果有则卸载掉:
[root@tomcat ~]# rpm -qa | grep java
[root@tomcat ~]# rpm -e java-1.7.0-openjdk-headless --nodeps 
[root@tomcat ~]# tar zxf jdk-8u211-linux-x64.tar.gz -C /usr/local/
[root@tomcat ~]# vim /etc/profile
添加以下内容:
//指定java路径
export  JAVA_HOME=/usr/local/jdk1.8.0_211    
//指定java运行环境
export  JRE_HOME=/usr/local/jdk1.8.0_211/jre 
//声明java中的类
export  CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar 
export  PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
[root@tomcat ~]# source /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)

2)安装tomcat
官网下载地址:https://tomcat.apache.org

[root@tomcat ~]# tar zxf apache-tomcat-8.5.35.tar.gz 
[root@tomcat ~]# mv apache-tomcat-8.5.35 /usr/local/tomcat8


Tomcat目录说明:
bin:存放windows或linux平台上或者关闭tomcat的脚本文件;
conf:存放tomcat服务器的全局配置文件,其中最重要的是server.xml和web.xml;
lib:tomcat运行需要的库文件(jars);
logs:tomcat运行时产生的日志文件;
temp:临时文件存放目录;
work:tomcat的工作目录,存放tomcat运行时的编译配置文件;
Webapps:tomcat的主要Web发布目录,默认情况下把Web应用文件放于此目录;

Tomcat常用配置文件说明:

server.xml:tomcat的主配置文件,可以设置端口号,设置域名或者ip;
web.xml:缺省的web app配置(也可以理解为是实现主配置文件没有定义到的功能:如果目录遍历,定义错误页面类型);
tomcat-user.xml:用来配置管理tomcat的用户与权限;

#运行tomcat(默认端口号8080)

[root@tomcat ~]# /usr/local/tomcat8/bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat8
Using CATALINA_HOME:   /usr/local/tomcat8
Using CATALINA_TMPDIR: /usr/local/tomcat8/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_211/jre
Using CLASSPATH:       /usr/local/tomcat8/bin/bootstrap.jar:/usr/local/tomcat8/bin/tomcat-juli.jar
Tomcat started.
[root@tomcat ~]# ss -anput | grep 8080
tcp    LISTEN     0      100      :::8080                 :::*                   users:(("java",pid=16505,fd=49))
#设置防火墙规则:
[root@tomcat ~]# firewall-cmd --add-port=8080/tcp --permanent
success
[root@tomcat ~]# firewall-cmd --reload
success

浏览器测试访问网页:

4,tomcat 应用

1, tomcat 中server.xml文件结构详解

server字段:代表整个容器,实例的顶层元素,一个配置文件中只能有一个server元素,可以包含多个service;


#表示通过远程连接8005端口,输入“SHUTDOWN”,能够实现远程关闭tomcat服务。

service字段:提供完整jvm的独立组件,java:java虚拟机,是一个虚构出来的虚拟机,可以包含一个engine,包含多个connector。

  
    #表示处理所有tomcat接受的请求,例如修改为“apache”,表示处理所有apache转发过来的请求

connector:接口定义,负责接收客户端的请求,以及向客户端返回响应结果;

        
//port:接收数据端口
//protocol:设置http协议
//connection Timeout:与客户端的连接超时时间,“-1”代表不限制客户端的连接时间
//redirectPort:当客户端请求是https,则将请求转发到8443去。

Engine:处理客户端的请求,可以包含多个host;

         
            //name是引擎名字,处理客户的请求(默认去寻找localhost)

Host:定义的虚拟主机,为特定的虚拟主机处理所有的客户端请求;

              

Context:运行在虚拟主机中的单个web应用;

通过上面各字段的含义,接下来了解Tomcat处理http请求过程:

1)请求被发送到tomcat的8080端口,被connector获得;
2)connector把该请求交给他所在的service的engine来处理,等待engine的处理结果;
3)engine匹配到名为localhost的host请求交给host;
4)host匹配到路径为(例如/web)的context;
5)context匹配到index.jsp页面,将结果返回给host;
6)host把servlet reponse对象返回给engine;
7)engine将servlet返回给conenctor;
8)connector返回给客户端;

2,tomcat 多实例配置

[root@tomcat ~]# cp -ra /usr/local/tomcat8/ /usr/local/tomcat8_2 #同时复制源目录或文件的属性和相关的链接
#修改tomcat主配文件
[root@tomcat ~]# vim /usr/local/tomcat8_2/conf/server.xml 
修改以下内容:
 22   
 69     
116     

#启动tomcat新实例:

[root@tomcat ~]# /usr/local/tomcat8_2/bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat8_2
Using CATALINA_HOME:   /usr/local/tomcat8_2
Using CATALINA_TMPDIR: /usr/local/tomcat8_2/temp
Using JRE_HOME:        /usr/local/jdk1.8.0_211/jre
Using CLASSPATH:       /usr/local/tomcat8_2/bin/bootstrap.jar:/usr/local/tomcat8_2/bin/tomcat-juli.jar
Tomcat started.

[root@tomcat ~]# ss -anput | grep 8081
tcp    LISTEN     0      100      :::8081                 :::*                   users:(("java",pid=16646,fd=49))
#设置防火墙:
[root@tomcat ~]# firewall-cmd --add-port=8081/tcp --permanent
success
[root@tomcat ~]# firewall-cmd --reload
success

#浏览器访问,url:http://172.16.1.100:8081/

3,自定义目录

[root@tomcat ~]# vim /usr/local/tomcat8/conf/server.xml 
#在Host处添加Context配置项:
      
                

//path: 指定访问的路径
//docBase:指定网页存放的路径
//reloadable:为true时,当web.xml文件有改动的时候自动重新加载,不用重启服务
//crossContext:为true时,表示不同的context共享一个session(会话池)
#创建自定义目录并存放动态文件:
[root@tomcat ~]# mkdir -p /data/project
[root@tomcat ~]# cd /data/project/
[root@tomcat project]# vim index.jsp

welcome to tomcat!!

#重启tomcat [root@tomcat ~]# /usr/local/tomcat8/bin/shutdown.sh [root@tomcat ~]# /usr/local/tomcat8/bin/startup.sh

浏览器访问,url:http://172.16.1.100:8080/test/

4,自定义监控页面

[root@tomcat ~]# mkdir /monitoring
[root@tomcat ~]# vim /monitoring/test.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 :
"); out.println("Max memory:"+mm+"MB"+"
"); out.println("Total memory: "+tm+"MB"+"
"); out.println("Free memory: "+fm+"MB"+"
"); out.println("Available memmory can be used is :"+(mm+fm-tm)+"MB"+"
"); %>

#在tomcat主配文件中添加自定义路径

添加以下内容:
                

#重启tomcat,浏览器进行测试:

[root@tomcat ~]# /usr/local/tomcat8/bin/shutdown.sh 
[root@tomcat ~]# /usr/local/tomcat8/bin/startup.sh 

5,JMX远程监控
#开启JMX远程调试功能:
[root@tomcat ~]# vim /usr/local/tomcat8/bin/catalina.sh
Tomcat_第1张图片

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"
//port:连接的端口号,一定不能与其他端口冲突
//ssl:关闭ssl安全传输
//authenticate:开启用户认证

#配置用户认证

[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
#在最后添加用户名和密码:
tomcat_test pwd@123
:wq!  //强制保存退出

#授权:

[root@tomcat management]# vim jmxremote.access
monitorRole   readonly
tomcat_test   readwrite \    //将原来的用户替换为tomcat-test
              create javax.management.monitor.*,javax.management.timer.* \
              unregister
#设置权限,并重启tomcat
[root@tomcat management]# chmod 600 jmxremote.password jmxremote.access 
[root@tomcat management]# /usr/local/tomcat8/bin/shutdown.sh 
[root@tomcat management]# /usr/local/tomcat8/bin/startup.sh 
[root@tomcat management]# netstat -anput | grep 8888
tcp6       0      0 :::8888                 :::*                    LISTEN      5159/java      
#开放8888端口:
[root@tomcat ~]# firewall-cmd --add-port=8888/tcp --permanent
success
[root@tomcat ~]# firewall-cmd --reload
success

#直接在终端命令行中输入jconsole:
[root@tomcat ~]# jconsole
Tomcat_第2张图片
Tomcat_第3张图片
登录成功后,可以针对特定的日期进行监控,监控项有内存,线程,类,和cpu。

6,启动tomcat管理后台

1)允许远程管理后台的主机:
[root@tomcat ~]# vim /usr/local/tomcat8/webapps/manager/META-INF/context.xml

Tomcat

2)授权管理的用户和密码:
[root@tomcat ~]# vim /usr/local/tomcat8/conf/tomcat-users.xml
添加以下内容:
 37         
 38         
 #角色为manager-gui,用户名为tomcat_manager,密码为pwd@123

role解释:

 manager-gui:允许访问html接口(即URL路径为/manager/html/*)
 manager-script:允许访问纯文本接口(即URL路径为/manager/text/*)
 manager-jmx:允许访问JMX代理接口(即URL路径为/manager/jmxproxy/*)
 manager_status:允许访问tomcat只读状态页面(即URL路径为/manager/status/*)
#重启tomcat
[root@tomcat ~]# shutdown.sh 
[root@tomcat ~]# startup.sh 

浏览器访问,url:http://172.16.1.100:8080/
Tomcat_第4张图片
Tomcat_第5张图片
tomcat后台登陆成功。

7,tomcat后台部署
1)创建测试war包(这里选择自定义war包)

[root@tomcat ~]# cat index.jsp 

welcome to tomcat-manager

[root@tomcat ~]# jar cf test.war index.jsp #打包成war包

2)登陆tomcat后台进行部署
Tomcat_第6张图片
Tomcat_第7张图片

3)用户通过浏览器进行访问,url:http://172.16.1.100:8080/test-manager/
Tomcat_第8张图片

#方法二:
Tomcat_第9张图片
Tomcat
浏览器测试访问:
Tomcat_第10张图片

8,tomcat日志切割(cronolog)
cronolog官网最近访问不了,所以我上传至网盘:https://pan.baidu.com/s/1SNNWLOB70M5V0dvVW4WF-Q
提取码:valo

#安装cronolog
[root@tomcat ~]# tar zxf cronolog-1.6.2.tar.gz 
[root@tomcat ~]# cd cronolog-1.6.2/
[root@tomcat cronolog-1.6.2]# ./configure && make && make install

#修改catalina.sh脚本文件:

[root@tomcat ~]# vim /usr/local/tomcat8/bin/catalina.sh 
447   #touch "$CATALINA_OUT"   #将其注释
471       org.apache.catalina.startup.Bootstrap "$@" start \
472         2>&1 | /usr/local/sbin/cronolog /usr/local/tomcat8/logs/catalina.%Y%m%d.out >> /dev/null &   #添加该内容项
473       #>> "$CATALINA_OUT" 2>&1 "&"  #将其注释
#重启tomcat
[root@tomcat ~]# shutdown.sh 
[root@tomcat ~]# startup.sh 

#查看切割后的日志文件:
Tomcat_第11张图片

9,自定义错误页面

[root@tomcat ~]# cd /usr/local/tomcat8/webapps/ROOT/
[root@tomcat ROOT]# vim error.jsp

ERROR,check you tomcat

[root@tomcat ROOT]# vim  ../../conf/web.xml 
在末尾添加以下字段

404
/error.jsp

#重启tomcat,网页测试
Tomcat_第12张图片

10,tomcat优化

1)内存优化
优化内存,主要是在bin/catalina.bat/sh 配置中进行。

[root@tomcat ~]# vim /usr/local/tomcat8/bin/catalina.sh 
JAVA_OPTS="-Dfile.encoding=UTF-8 -server -Xms2048m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=10 -XX:NewRatio=2 -XX:+DisableExplicitGC"

重启tomcat生效。
参数解释:

-Dfile.encoding:默认文件编码;
-server:表示这是应用于服务器的配置,JVM内部会有特殊处理的;
-Xmx1024m:设置JVM最大可用内存的1024MB;
-Xms1024m:设置JVM最小内存为1024m,此值可用设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存;
-XX:NewSize:设置年轻代大小;
-XX:MaxNewSize:设置最大的年轻代大小;
-XX:PermSize:设置永久代大小;
-XX:MaxPermSize:设置最大永久代大小;
-XX:NewRatio=4:设置年轻代(包括 Eden 和两个 Survivor 区)与终身代的比值(除去永久代),
设置为 4,则年轻代与终身代所占比值为 1:4,年轻代占整个堆栈的 1/5;
-XX:MaxTenuringThreshold=10:设置垃圾最大年龄,默认为:15;
如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。
如果将此值设置为一个较大值,则年轻代对象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率;
-XX:+DisableExplicitGC:这个将会忽略手动调用 GC 的代码使得System.gc() 的调用就会变成一个空调用,完全不会触发任何 GC;

一般来说,应该使用武力内存的80%最为堆大小。
说明:以上两个参数(-Xmx、-Xms)关系到tomcat承受的访问性能,但也要根据服务器实际内存情况设定。一般建议Xms和Xmx的值取成一样比较好,可以加快内存回收速度。

2)线程优化
线程优化,主要修改conf/server.xml文件

[root@tomcat ~]# vim /usr/local/tomcat8/conf/server.xml 
#打开默认被注释的连接池配置:
 56     

修改为:

 56     

参数解释:

  • name:共享线程池的名字,这是connector为了共享线程池要引用的名字,改名字必须唯一;
  • namePrefix: 在JVM上,每运行线程都可以有一个name字符串,这一属性为线程池中每个线程的name字符串设置了一个前缀,Tomcat将把线程号追加到这一前缀后面,默认值为tomcat-exec-;
  • maxThreads="X":表示最多同时处理X个连接,最大并发数,默认设置成200,一般建议在500~800,根据硬件设施和业务来判断;
  • minSpareThreads="X" :初始化X个连接;
  • prestartminSpareThreads:在tomcat初始化的时候就初始化minSpareThreads 的参数值,如果不等于 true,minSpareThreads 的值就没啥效果了;
  • maxQueueSize:最大的等待队列数,超过则拒绝请求。

#修改默认的链接参数配置:

 67     

修改为:

 67     

重要参数解释:

  • protocol:Tomcat 8 设置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol(如果这个用不了,就用下面那个)
  • protocol:Tomcat 6、7 设置 nio 更好:org.apache.coyote.http11.Http11NioProtocol;
  • acceptCount:指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认设置100;
  • maxPostSize:以FROM URL 参数方式的POST提交放肆,限制提交最大的大小,默认是2097152(2MB),它使用的单位是字节,10485760 为 10M。如果要禁用限制,则可以设置为 -1。
  • acceptorThreadCount:用于接收连接的线程的数量,默认值是1,一般这个指需要改动的时候是因为该服务器是一个多核CPU,如果是多核CPU一般设置为2.

    其中和最大连接相关的参数maxThreads和cceptCount。如果要加大并发连接数,应同时加大这个参数;
    web server运行的最大连接数还受制于操作系统1内核参数设置,linux通常是1000个左右。

3)tomcat连接数相关参数配置

  • enableLookups:是否反查询域名【禁用DNS查询】,默认值为true,为了提高处理能力,应配置为false;
  • connnectionTimeout:网络连接超时,默认值60000,单位:毫秒。配置为0表示永不超时,这样配置有隐患的,通常可配置为30000毫秒;
  • maxKeepAliveRequests:
  • nginx动态的转给tomcat,nginx是不能keepalive的,而tomcat端默认开启了keepalive,会等待keepalive的timeout,默认不设置就是使用connectionTimeout。
  • 所以必须设置tomcat的超时时间,并关闭tomcat的keepalive,否则会产生大量tomcat的socket timewait。
    maxKeepAliveRequests="1"  //表示每个连接只响应一次就关闭,这样就不会等待timeout了
    connectionTimeout="20000"
  • bufferSize:输入流缓冲大小,默认值是2048 bytes;
  • compression:压缩传输,取值on/off/force,默认时off;

11,tomcat connector(连接器)三种运行模式

Tomcat支持三种接收请求的方式:BIO NIO APR

  • 1)BIO:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。tomcat7或以下在linux系统中默认使用这种方式。

  • 2)NIO:利用java的异步IO处理,可以通过少量的线程处理大量的请求。tomcat8在linux系统中默认使用这种方式。tocmat7必须修改connector配置来启动(conf/server.xml配置文件),如下所示:

<Connectorport="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"redirectPort="8443"/>

  • 3)APR(Apache Portable Runtime):从操作系统级别解决异步IO问题,大幅度的提高服务器的处理和相应的性能,也是tomca台运行高并发的首选模式。linux如果安装了apr和native,那么tomcat直接启动就支持apr。
    APR提供的主要功能模块包括:内存分配及内存池、原子操作、文件I/O、锁、内存映射、哈希表、网络I/O、轮询、进程及线程操作等等,通过采用APR,Tomcat可以获得高度可扩展性以及优越的性能,并且可以更好的与本地服务器技术集成,从而可以使Tomcat作为一款通用的Web服务器使用,而不仅仅作为轻量级应用服务器。在这种情况下,Java将不再是一门侧重于后端的编程语言,也可以更多的用于成熟的Web服务器平台。

11.1,apr模式
安装apr以及tomcat-native:
1)安装依赖库:

[root@tomcat ~]# yum -y install apr-devel openssl-devel
注意:openssl库要求在0.9.7以上版本,APR要求在1.2以上版本,用rpm -qa | grep openssl检查本机安装的依赖库版本是否大于或等于apr要求的版本。

2)安装apr动态库:

[root@tomcat ~]# cd /usr/local/tomcat8/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   #动态库默认安装在/usr/local/apr/lib目录下(

3)配置APR本地库到系统共享库搜索路径中:

[root@tomcat ~]# vim /usr/local/tomcat8/bin/catalina.sh 
#添加以下内容
JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"

4)修改运行模式:

#将protocol从HTTP/1.1改成org.apache.coyote.http11.Http11AprProtocol
[root@tomcat ~]# vim /usr/local/tomcat8/conf/server.xml 
    

5)运行tomcat,看到如下日志表示成功开启apr模式:
Tomcat_第13张图片