一.Tomcat介绍
Tomcat是Apache旗下一款专门用来运行servlet和JSP WEB应用软件的容器,也就是说它的核心功能是针对Java应用,虽然Tomcat也可以像Apache一样解析html、图片、js、css等资源,但它在高并发方面比较弱,所以在传统的结构中,Tomcat专门处理Java应用,而静态的资源交给nginx来处理。
在Server、JSP应用容器领域里,Tomcat可以说占有很重要的一席之地,这得益于它的开源、稳定、技术领先等特点,当然也少不了Apache软件基金会和SUN公司的大力推广和支持。
tomcat目前主流的版本为:7.0、8.0、8.5、9.0,可以参考链接文文档进行查看:https://tomcat.apache.org/各种版本的相关信息。
二.java基础的相关概念
1.基础概念
JAVAEE:Java Platefeom Enterprise Edition,JAVA的企业版本,用来做网站。
JAVASE:Java Plateform Standard Edition,JAVA的标准版本,用来电脑上运行软件。
JAVAME:Java Platefrom Micro Edition ,JAVA微型版本,做收集软件的。
JDK:Java Developmnet kit,java开发和运行环境,JDK=java的开发工具+JRE
JRE:Java Runtime Environment,java程序的运行环境,包含java运行所需要的类库和JVM。
JVM:Java application archive,JAVA虚拟机,在linux、windows平台运行JAVA就得使用JVM。
jar:java application archive,包含class和一些资源和配置文件的压缩包。
war:web application archive,与jar基本相同,办好全部的web应用程序,tomcat会自动将其部署。
2.servlet与jsp比较
a)在html代码中内嵌JAVA代码就是JSP,而Servlet是纯JAVA代码写的。
b)JSP主要是用来展现页面效果,而Servlet主要负责逻辑控制。
c)第一次运行JSP时,会自动转换为Servlet代码,所以说JSP本质上就是一种Servlet。
d)第一次访问Servlet时,会将其编译为类文件,后续可以直接访问类文件。
三.tomcat安装
tomcat本身是有JAVA语言开发的,它也属于JAVA的一个应用,所以运行tomcat必须要有Jdk的支持。JDK有开源的Openjdk也有orecle提供的JDK,在Centos系统中,大家可以直接通过yum进行安装openjdk,比较简单。
注意:openjdk 与orecle提供的JDK是不兼容的。
3.1安装jdk。
方法一:安装openjdk
[root@db01 ~]# yum -y install java-1.8.0-openjdk
说明:这样安装简便无需配置环境变量
方法二:安装orecle的JDK
下载链接JDK的地址:https://www.oracle.com/technetwork/cn/java/javaee/downloads/index.html
#这里需要下载JDK1.8版本的二进制安装包,安装比较方便
#1.方法一
使用rpm包安装,两种安装执行任意一条既可。
[root@db01 /opt]# yum -y localinstall jdk-8u102-linux-x64.rpm
[root@db01 /opt]# rpm -ivh jdk-8u102-linux-x64.rpm
#2.方法二
[root@db01 /opt]# tar xf jdk-8u60-linux-x64.tar.gz -C /usr/local
[root@db01 /opt]# ln -s /app/jdk1.8.0_60 /usr/local/jdk
#配置环境变量
[root@db01 /opt]# sed -i.ori '$a export JAVA_HOME=/app/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
#重新加载环境变量
[root@db01 /opt]# source /etc/profile
3.2安装tomcat
说明:这里使用的事tomcat8.0.27
1)下载二进制包链接地址:https://tomcat.apache.org/download-80.cgi
2)解压二进包到/usr/local下并设置软链接到tomcat
[root@db01 /opt]# tar xf apache-tomcat-8.0.27.tar.gz -C /usr/local/
[root@db01 /opt]# ln -s /usr/local/apache-tomcat-8.0.27/ /usr/local/tomcat
3)启动tomcat
[root@db01 /opt]# /usr/local/tomcat/bin/startup.sh
4)查看端口监听状态
[root@db01 /opt]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7121/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 7265/master
tcp6 0 0 :::8009 :::* LISTEN 14084/java
tcp6 0 0 :::8080 :::* LISTEN 14084/java
tcp6 0 0 :::22 :::* LISTEN 7121/sshd
tcp6 0 0 ::1:25 :::* LISTEN 7265/master
tcp6 0 0 127.0.0.1:8005 :::* LISTEN 14084
可以看到tomcat默认的监听了3个端口,其中8080为web服务端口;8009为AJP端口,它可以被Apache调用,从而让Apache和tomcat结合在一起提供服务;8005端口为管理端口。
四.tomcat的8005端口启动慢的问题
tomcat在重启时,经常会出现8005端口启动慢的问题,一般需要等十几秒甚至几十秒。为什么会出现启动慢的情况,这里就需要搞清楚具体的原因。
tomcat启动时,会通过java.security.SecureRandom生成随机数来实现,随机数算法使用的是“SHA1PRNG”,这个算法的提供者在底层依赖到操作系统提供的随机数,在linux上,与之相关的是/dev/random和/dev/urandom。
/dev/random设备会返回小于熵池噪声的随机数字节。/dev/random可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random的读操作将会被阻塞,知道收集到足够的环境噪声为止,而/dev/urandom则是一个非阻塞的发生器。它是/dev/random的副本,它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom的读取操作不会产生阻塞,但其输出的熵可能小于/dev/random。
总之,8005端口启动慢就是因为JVM调用系统的/dev/random设备生成随机数,而/dev/random生成的随机数时会被block了,自然就会导致8005端口启动慢,解决办法是不使用/dev/random,而是使用/dev/urandom。具体步骤如下:
#orcel 的JDK的优化操作如下:
[root@db01 ~]# vim /usr/java/jdk1.8.0_102/jre/lib/security/java.security
securerandom.source=file:/dev/urandom
#openjdk
优化目录实在/usr/lib/jvm
五.tomcat目录结构介绍
[root@db01 /usr/local/tomcat]# ll
total 92
drwxr-xr-x 2 root root 4096 Nov 19 19:24 bin #主要包含启动、关闭tomcat脚本和脚本依赖文件
drwxr-xr-x 3 root root 198 Nov 19 19:25 conf #tomcat配置文件目录
drwxr-xr-x 2 root root 4096 Nov 19 19:24 lib #tomcat运行需要加载的jar包
-rw-r--r-- 1 root root 57011 Sep 28 2015 LICENSE #license文件,不重要
drwxr-xr-x 2 root root 197 Nov 19 19:25 logs #在运行过程中产生的日志文件
-rw-r--r-- 1 root root 1444 Sep 28 2015 NOTICE #不重要
-rw-r--r-- 1 root root 6741 Sep 28 2015 RELEASE-NOTES #版本特性,不重要
-rw-r--r-- 1 root root 16204 Sep 28 2015 RUNNING.txt #帮助文件,不重要
drwxr-xr-x 2 root root 30 Nov 19 19:24 temp #存放临时文件
drwxr-xr-x 7 root root 81 Sep 28 2015 webapps #站点目录
drwxr-xr-x 3 root root 22 Nov 19 19:25 work #tomcat运行时产生的缓存文件
六.tomcat配置文件
核心文件详解
一个tomcat实例一个server
一个server中包含多个Connector,Connector的主要功能是接受、响应用户请求。
service的作用是:将connector关联至engine(catalina引擎)
一个host就是一个站点,类似于nginx的多站点
context类似于nginx中location的概念
Tomcat的配置文件server.xml
在/usr/local/tomcat/conf/目录下,有个server.xml文件,这个就是Tomcat的核心配置文件。先来看下server.xml配置文件的结构:
<Server>
<Service>
<Engine>
<Host>
</Host>
</Engine>
</Service>
</Server>
最里层的<host></host>就是Tomcat的虚拟主机,主机名(域名)、网站目录等属性就在这里面配置。如下是一个主机配置示例:
<!-- 端口配置为8080 -->
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
<!-- 默认主机配置为www.weiaixiong.com -->
<Engine defaultHost="www.weiaixiong.com" name="Catalina">
<!-- 设置主机名为www.weiaixiong.com -->
<Host appBase="webapps" autoDeploy="true" name="www.weiaixiong.com" unpackWARs="true">
<!-- Context的配置如下,docBase默认,path设置为/ -->
<Context docBase="test" path="/" reloadable="true" />
</Host>
</Engine>
说明:Tomcat的网站目录设置有点麻烦,appBase、docBase和Context的path都对网站目录有影响,建议appBase不要动,即webapps目录,而docBase设置一个相对路径(相对webapps的一个目录),path就设定为'/',最终结合在一起,就是webapps/test/。
再来看看上面这段配置里的其他配置项的含义:
1)port:定义下面的<host></host>监听的端口是8080;
2)defaultHost:定义该端口下,默认虚拟主机是哪一个;
3)appBase:定义该应用存放路径,可以把war包直接扔到该目录下,实现自动部署;
4)autoDeploy:定义是否可以自动自动部署;
5)name:定义网站的域名;
6)unpackWARs:定义是否自动解压war包;
7)docBase:定义本"Context"(类似Nginx的location)所在路径,它是一个目录,如果是绝对路径那跟appBase没有关系,如果是相对路径,则指的是相对appBase的一个目录;
8)path:定义本"Context"访问时的地址,比如定义path为123,则访问该"Context"时,应该是http://host/123/, 所以这个地址是访问链接里面的地址,并不是系统目录;
9)reloadable:定义该"Context"是否允许自动加载,即当应用有所更改时,不重启Tomcat就可以自动加载。
七.Tomcat日志
遇到问题首先要想到查日志,日志中通常会记录产生这问题的原因。不过有个问题,绝大多数日志都是英文,如果你读不懂怎么办?简单,只需要关注几个关键词"Error"、"Warning"、"No"、"Permmision"、"Can't"、"not"等等,然后把带有这个关键词的那一段文字直接复制粘贴到搜索引擎里去搜索即可。
Tomcat日志在/usr/local/tomcat/logs/目录下,大概有这么几类文件:catalina.out、catalina.xxxx-xx-xx.log、host-manager.xxxx-xx-xx.log、manager.xxxx-xx-xx.log、localhost.xxxx-xx-xx.log、xxx_access_log.xxxx-xx-xx.txt。哇~怎么这么多?遇到问题我们该查哪个?
记住一点即可,遇到问题查catalina.out,这个日志是核心日志,无论正确的信息还是错误的信息,不管是tomcat服务本身的还是tomcat跑的应用都会记录到这个日志里。 两个manager日志是管理台相关的日志,不用关注。而access_log是访问日志,记录客户端访问网站的情况,这个日志其实可以不让它记,而是在前端Nginx代理上记录,所以也不用关注。这个带日期的catalina.xxxx-xx-xx.log是catalina引擎相关的日志,可以认为是tomcat服务本身的日志,其实这个也不用关注,因为它和catalina.out是重复的,也就是说这个里面记录的信息在catalina.out里就有。还有个localhost.xxxx-xx-xx.log,它主要是应用初始化(listener, filter, servlet)未处理的异常最后被tomcat捕获而输出的日志,其实也不用怎么关注。
日志配置文件conf/logging.properties,里面主要定义了非访问日志的一些属性,比如日志路径、哪些日志记录到哪个文件(名字)、日志级别、存储周期等信息,这个配置文件我们一般都不会更改,保持默认即可。而访问日志的格式、路径是在server.xml中定义的,如下为访问日志的配置片段:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
细心的你也许一经发现,catalina.out文件并没有日期后缀,这样就意味着该文件并不会自动切割,它会越写越大。解决该问题的方法有两个:
1)每隔一段时间清空该文件,比如增加一个计划任务
0 0 */5 * * echo "" > /usr/local/tomcat/logs/catalina.out
2)用系统自带的logrotate工具切割
# vim /etc/logrotate.d/tomcat //写入如下内容
/usr/local/tomcat/logs/catalina.out {
copytruncate # 创建新的catalina.out副本后,截断源catalina.out文件
daily # 每天进行catalina.out文件的轮转
rotate 7 # 至多保留7个副本
missingok # 如果要轮转的文件丢失了,继续轮转而不报错
compress # 使用压缩的方式(节省硬盘空间)
size 16M # 当catalina.out文件大于16MB时,就轮转
}
tomcat部署博客请参考链接:https://www.jianshu.com/p/d9bf3283b7c8