Tomcat基础

一.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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容