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
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
登录成功后,可以针对特定的日期进行监控,监控项有内存,线程,类,和cpu。
6,启动tomcat管理后台
1)允许远程管理后台的主机:
[root@tomcat ~]# vim /usr/local/tomcat8/webapps/manager/META-INF/context.xml
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后台登陆成功。
7,tomcat后台部署
1)创建测试war包(这里选择自定义war包)
[root@tomcat ~]# cat index.jsp
welcome to tomcat-manager
[root@tomcat ~]# jar cf test.war index.jsp #打包成war包
3)用户通过浏览器进行访问,url:http://172.16.1.100:8080/test-manager/
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
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
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