Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个servelet容器,按照Sun microsystems提供的技术
规范开发出来,Tomcat 8实现了对servlet 3.1和Javaserver page 2.3(JSP)的支持,并提供了做为web服务器的
一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat附加组件等php
安装jdk和apachehtml
多实例(一个主机运行多个Tomcat)java
查看
JPS命令功能描述:jps是用于查有权限访问的hotspot虚拟机(jdk中带的虚拟机)的进程
命令语法: jps [options] [hostid]
options:命令选项,用来对输出格式进行控制
-p 仅仅显示vm标识,不显示jar,class,main参数等信息
-m 输出主函数传入的参数
-l 输出应用程序主类完整package名称或jar完整名称
-v 列出jvm参数,-Xms20m -Xmx50m是启动程序指定的jvm参数与
-V 输出经过.hotsportrc或者-XX:Flags=<filename>指定的jvm参数
hostid:指定特定主机,可使IP地址或域名,也能够指定具体协议,端口 [protocol:][//hostname][:port]
[servername]web
配置
目录结构
程序目录
——Tomcat执行脚本目录 conf ——Tomcat配置文件 lib ——Tomcat运行须要的库文件(JARS) logs ——
Tomcat执行时的LOG文件 temp ——Tomcat临时文件存放目录 webapps ——Tomcat的主要Web发布目录(存
放咱们本身的JSP,SERVLET,类) work ——Tomcat的工做目录,Tomcat将翻译JSP文件到的Java文件和class文件
放在这里
web工程发布目录结构 webapps是
Tomcat的主要Web发布目录,默认状况下把Web应用文件放于此目录 项目名: 项目名下面有WEB-INF ,
META-INF,两个文件夹,和一些给浏览器访问的资源,如html文件;
WEB-INF:能够称为是安全目录,由于在这下面的文件,浏览器是访问不到的,数据库
默认webapps目录结构
docs:Tomcat帮助文档 examples:web应用实例 host-manager:主机管理 manager:应用管理 ROOT:默认站点根
目录
配置文件
conf目录主要是用来存放tomcat的一些配置文件。
server.xml 主配置文件 web.xml 与其余适用于整个web应用程序设置的配置文件 context.xml 默认的context设
置,应用于安装了Tomcat的全部主机的全部部署内容 tomcat-users.xml用来配置管理tomcat的用户与权限
catalina.xml Tomcat的安全防御策略文件
组件apache
自定义目录
修改server.xml文件中的host元素 #appBase 定义站点目录 #docBase 定义应用目录 #Context path 指出你的访
问路径(虚拟应用名,可为空) #Context docBase 指定你的存放路径 #debug 为设定dedug的登记,0提供最
少的信息,9提供最多的信息 #reloadable=true 当web.xml或者class有改动的是后续都会自动更新加载,不须要
重新启动服务 #crosscontext="true" 表示配置的不一样context共享一个session #unpackWARs 是否自动解压war
包 #autoDeploy 是否自动部署(热部署)
appBase 这个目录表示: 这个目录下面的子目录将自动被部署为应用(autoDeploy="true") 这个目录下的war
文件将被自动解压缩并部署为应用(unpackWARs="true") 这个目录下的子目录,会当作单独的虚拟目录,或
者叫应用 若是不想使用Tomcat下的webapp目录路,则appBase下面加一行docBase,把路径配置到docBase
中,把appBase为空就能够了编程
自定义目录vim
自定义一个监控页面,经过web查看运行性能(相似phpinfo) server.xml以下设置后端
远程监控
Tomcat开启JMX远程调试功能浏览器
查看端口
6.测试
后台
app manager
作这个的时候要把catalina.sh里边写入的东西删除掉,不然Tomcat没法访问到页面
查看端口
测试
测试
(1)
(2)
热部署
tomcat的热部署实现原理:tomcat启动的时候会有启动一个线程每隔一段时间会去判断应用中加载的类是否发生
变法(类总数的变化,类的修改),若是发生了变化就会把应用的启动线程中止掉,清除引用,而且把加载该应
10-Tomcat.md 5/12/2019
18 / 23
用的WebappClassLoader设为null,而后建立一个新的WebappClassLoader来从新加载应用。
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
reloadable的做用是当你修改了jsp以后会自动编译class文件,等于即时生效,可是代价不低,适合本地
开发调试,通常在开发阶段将reloadable的属性设置为true,有助于调试servlet和其余的class文件,可是
因为这样会增长服务器的运行负载,损耗系统性能,在项目运行阶段将它设置为false
war包部署
直接将web项目文件(通常是复制生成的war包)复制到Tomcat的webapps目录
若是Tomcat没有开启自解压,则将war包解压到webapps目录
解压命令jar(解压到当前目录) jar -xf bdqnweb.war war包也可使用unzip解压,使用unzip命令的时候,可
以指定解压目录
安全
端口防御
修改目标端口为不易猜想的端口,下降自动扫描软件发现到的概率
后台管理
删除默认的管理后台(若是不须要使用),下降被爆破和提权的风险
删除webapp下的host-manager和manager目录
禁用目录浏览
修改 conf/web.xml文件,将listings改成false
隐藏信息
尽可能避免暴露服务器的版本信息,隐藏错误页面。在配置中对一些常见的错误进行重定向,避免出现错误时
Tomcat默认显示的错误页面暴露服务器和版本信息;必须确保程序根目录下的错误页面已经存在;
vim conf/web.xml
添加内容
<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>
重启Tomcat,测试一下
firefox 192.168.43.249:8088/aaaaaaaaaaaaaaa
注意:这里的意思是说,若是是404的错误就找/目录下的notfound.jsp,因此必定要知道本身的网页根目录在哪,并在这个目录下建立notfound.jsp页面,页面内容本身编辑 网页根目录是server.xml文件中 host 标签下的context标签里的docBase
上边web.xml中只写了404报错的,其余常见报错也能够写,好比
<error-page>
<error-code>403</error-code>
<location>/forbidden.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/notfound.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/systembusy.jsp</location>
</error-page>
脚本权限收回
去除其余用户对Tomcat的bin目录下的 shutdown.sh、startup.sh、catalina.sh的可执行权限,防止其余用户有
Tomcat的权限 chmod -R 744 /usr/local/apache-tomcat-8.5.35/bin/
日志规范
开启Tomcat默认访问日志中的referer和user-agent记录,开启这两个是为了一旦出现安全问题,可以更好的根
据日志进行问题排查
[root@localhost apache-tomcat-8.5.35]# vim conf/server.xml
原来是这样:
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
10-Tomcat.md 5/12/2019
20 / 23
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
修改后的样子:
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t %r %s %b %{Referer}i %{User-Agent}i %D" />
主机管理器的使用 (末尾添加)
<role rolename="admin-gui"/>
<user username="xgp" password="123.com" roles="admin-gui"/>
浏览器测试
日志切割使用cronolog
重启tomcat
定义错误页面
线程池优化
2.重启tomcat
Tomcat优化
1 /usr/local/tomcat/bin/catalina.sh 开头添加
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:ParallelGCThreads=15
-XX:+DisableExplicitGC"
-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中的内存回收机制
2.重启tomcat
Tomcat的请求方式
Tomcat支持三种接收请求的方式:BIO NIO APR
一、BIO:每一个请求都要建立一个线程来处理,线程开销比较大,不适用高并发的场景,性能也最低
二、NIO:基于缓冲区,能提供非阻塞I/O操做,和传统的BIO相比,具有更好的并发性能
三、APR(Apache portable run-time libraries):简单理解,就是从操做系统级别解决异步IO问题,大幅度的提升服务器的处理和相应性能,也是Tomcat运行高并发的首选模式
APR提供的主要功能模块包括:内存分配及内存池、原子操做、文件I/O、锁、内存映射、哈希表、网络I/O、轮询、进程及线程操做等等,经过采用APR,Tomcat能够得到高度可扩展性以及优越的性能,而且能够更好的与本地服务器技术集成,从而可使Tomcat做为一款通用的Web服务器使用,而不只仅做为轻量级应用服务器。在这种状况下,Java将再也不是一门侧重于后端的编程语言,也能够更多的用于成熟的Web服务器平台。
Excutor重要参数说明: