1、Tomcat介绍

Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache.Sun和其他一些公司及个人共同开发而成。

Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。

Tomcat和Nginx、Apache(httpd)、lighttpd等We b服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如

Nginx/Apache服务器。

目前Tomcat最新版本为9.0。Java容器还有resin、weblogic等。

Tomcat官网:http://tomcat.apache.org

2、Tomcat基础JDK

JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

JDK包含了一批用于Java开发的组件,其中包括:

  1. javac:编译器,将后缀名为.java的源代码编译成后缀名为“.c1ass”的字节码
  2. java:运行工具,运行.class的字节码
  3. jar:打包工具,将相关的类文件打包成一个文件
  4. javadoc:文档生成器,从源码注释中提取文档,注释需匹配规范
  5. jdb debugger:调试工具
  6. jps :显示当前java程序运行的进程状态
  7. javap:反编译程序
  8. appletviewer:运行和调试applet程序的工具,不需要使用浏览器
  9. javah: Java类生成C头文件和C源文件。这些文件提供了连接胶合,使JavaC代码可进行交互。
  10. javaws:运行JNLP程序
  11. extcheck:一个检测jar包冲突的工具
  12. apt:注释处理工具
  13. jhat: java堆分析工具
  14. jstack:栈跟踪程序
  15. jstat:JVM检测统计工具
  16. jstatd: jstat守护进程
  17. jinfo:获取正在运行或崩溃的java程序配置信息
  18. jmap:获取java进程内存映射信息
  19. idlj: IDL-to-ava编译器。将IDL语言转化为java文件
  20. policytool:一个GUI的策略文件创建和管理工具
  21. jrunscript:命令行脚本运行

JDK中还包括完整的JRE (Java Runtime Environment),Java运行环境,也被称为private runtime。包括了用于产品环境的各种库类,如基础类库rt.jar,以及给开发人员使用的补充库,如国际化与本地化的类库、IDL库等等。JDK中还包括各种样例程序,用以展示Java API中的各部分。

JDK下载面页: https://www.oracle.com/java/technologiesljavase-jdk8-downloads.html

3、安装Tomcat & JDK

详略

  1. #jdk environment
  2. export JAVA_HOME=/usr/local/jdk
  3. export JRE_HOME=$JAVA_HOME/jre
  4. export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
  5. export PATH=$PATH:${JAVA_HOME}/bin
  6. #set zookeeper environment
  7. export ZK_HOME=/usr/local/apache-zookeeper-3.5.8-bin
  8. export PATH=$PATH:$ZK_HOME/bin
  9. #KAFKA_HOME
  10. export KAFKA_HOME=/usr/local/kafka
  11. export PATH=$PATH:$KAFKA_HOME/bin
  12. # centos配置yum 安装的openjdk环境变量
  13. yum -y install java-1.8.0-openjdk-devel.x86_64
  14. JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64
  15. JRE_HOME=${JAVA_HOME}/jre
  16. CLASS_PATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar:${JRE_HOME}/lib
  17. PATH=$PATH:${JAVA_HOME}/bin:${JRE_HOME}/bin

4、Tomcat目录介绍

4.1 Tomcat主目录介绍

  1. [root@4bc2f7c112e1 tomcat]# yum -y install tree
  2. [root@4bc2f7c112e1 tomcat]# tree -L 1
  3. # -L 表示显示第基层目录
  4. .
  5. ├── bin # 存放tomcat管理脚本
  6. ├── BUILDING.txt
  7. ├── conf # tomcat配置文件存放目录
  8. ├── CONTRIBUTING.md
  9. ├── lib # web应用调用的jar包存放路径
  10. ├── LICENSE
  11. ├── logs # 日志
  12. ├── NOTICE
  13. ├── README.md
  14. ├── RELEASE-NOTES
  15. ├── RUNNING.txt
  16. ├── temp # 存放临时文件
  17. ├── webapps # web程序存放目录
  18. └── work # 存放编译产生的.java 与 .class

4.2 webapps目录介绍

  1. [root@4bc2f7c112e1 webapps]# tree -L 1
  2. ├── docs # tomcat帮助文档
  3. ├── examp1es # web应用实例
  4. ├── host-manager #主机管理
  5. ├── manager #管理
  6. ├── ROOT #默认站点根目录

4.3 Tomcat配置文件目录介绍(conf)

  1. [root@4bc2f7c112e1 conf]# tree -L 1
  2. .
  3. ├── Catalina
  4. ├── catalina.policy
  5. ├── catalina.properties
  6. ├── context.xml
  7. ├── jaspic-providers.xml
  8. ├── jaspic-providers.xsd
  9. ├── logging.properties
  10. ├── server.xml # 主配置文件
  11. ├── tomcat-users.xml # tomcat 管理用户配置文件
  12. ├── tomcat-users.xsd
  13. └── web.xml

5、Tomcat运维

5.1 tomcat启动停止

  1. # 启动脚本 startup.sh
  2. # 停止脚本 shutdown.sh

注意: tomcat未启动的情况下使用shutdown脚本,会有大量的输出信息。

5.2 检查tomcat是否启动正常

  1. netstat -tnlup | grep java

说明:所有与java相关的,服务启动都是java命名的进程

5.3 浏览器访问

IP:8080

5.4 Tomcat日志说明

  1. tail -f catalina.out

发现启动时间较长,其中有一项的启动时间占据了绝大多数

  1. 24-Nov-201715:09:50.629 INFO [1oca1host-startstop-1]
  2. org.apache.catalina.startup.HostConfig.dep1oywAR Dep1oyment of web application archive/application/apache-tomcat-8.0.27/webapps/memtest.war has finished in 58,892 ms

发现耗时在这里:是session引起的随机数问题导致的。Tocmat的Session lD是通过SHA1算法计算得到的,计算Session lD的时候必须有一个密钥。为了提高安全性Tomcat在启动的时候会通过随机生成一个密钥。

1、解决Tomcat启动慢的方法

Tomcat启动慢主要原因是生成随机数的时候卡住了,导致tomcat启动不了。

是否有足够的嫡来用于产生随机数,可以通过如下命令来查看

  1. cat /proc/sys/kernel/random/entropy_avail
  2. 2741

为了加速/dev/random提供随机数的速度,你可以通过操作设备的外设,让其产生大量的中断,网络传输数据,按键,移动鼠标,在命令行敲几个不同的命令,俗称聚气。

cat /dev/random会消耗能量

方法1:

  1. [root@4bc2f7c112e1 bin]# vim $JAVA_HOME/jre/1ib/security/java.security
  2. securerandom.source=file:/dev/random

改为

  1. securerandom.source=file:/dev/urandom

方法2:

  1. [root@4bc2f7c112e1 bin]# vi catalina.sh
  2. if [[ "$JAVA_OPTS" != *-Djava.security.egd=* ]]; then
  3. JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/urandom"
  4. fi

这个系统属性egd表示嫡收集守护进程(entropy gathering daemon)

方法3:(推荐)

  1. # 安装rngd服务(熵服务,增大熵值)
  2. yum -y install rng-tools
  3. # 启动服务
  4. systemctl start rngd

5.5 Tomcat管理功能

注意:测试功能,生产环境不要用

Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能,就需要配置管理用户,即配置tomcat-users.xml文件。

  1. vi tomcat-users.xml
  2. <role rolename="manager-gui " />
  3. <role rolename="admin-gui " />
  4. <user username="tomcat" password="tomcat" roles="manager-gui , admin-gui" />
  5. </tomcat-users>#在此行前加入上面三行
  6. 需要注释一下内容:
  7. vi /app1ication/tomcat/webapps/manager/META-INF/context.xm1
  8. <!-- <Valve c1assName="org.apache.catalina.va1ves.RemoteAddrva1ve"
  9. a77ow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1”/> -->

5.6 Tomcat主配置文件详解

1、server.xml组件类别

顶级组件:位于整个配置的顶层,如server。

容器类组件:可以包含其它组件的组件,如service、engine、host、 context。

连接器组件:连接用户请求至tomcat,如connector。

被嵌套类组件:位于一个容器当中,不能包含其他组件,如Valve、logger。

  1. <server>
  2. <service>
  3. <connector /><engine>
  4. <host>
  5. <context></ context>
  6. </host>
  7. <host>
  8. <context></context>
  9. </host>
  10. </engine>
  11. </service>
  12. </server>

2、组件介绍

Web中间件Tomcat详解(qf) - 图1

Web中间件Tomcat详解(qf) - 图2

3、server.xml配置文件注释

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!--
  3. <Server>元素代表整个容器,是Tomcat实例的顶层元素.由org.apache.catalina.Server接口来定义.它包含一个<service>元素.并且它不能做为任何元素的子元素 .
  4. port指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令.该属性是必须的.
  5. shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置
  6. -->
  7. <Server port="8005" shutdown="SHUTDOWN">
  8. <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  9. <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  10. <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  11. <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  12. <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  13. <GlobalNamingResources>
  14. <Resource name="UserDatabase" auth="Container"
  15. type="org.apache.catalina.UserDatabase"
  16. description="User database that can be updated and saved"
  17. factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
  18. pathname="conf/tomcat-users.xml" />
  19. </GlobalNamingResources>
  20. <!-- service服务组件 -->
  21. <Service name="Catalina">
  22. <!-- connectors主要参数说明(见下表) -->
  23. <Connector port="8080" protocol="HTTP/1.1"
  24. connectionTimeout="20000"
  25. redirectPort="8443" />
  26. <!--engine,核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host
  27. defau1tHost指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的
  28. -->
  29. <Engine name="Catalina" defaultHost="localhost">
  30. <! --Realm表示存放用户名,密码及role的数据库-->
  31. <Realm className="org.apache.catalina.realm.LockOutRealm">
  32. <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
  33. resourceName="UserDatabase"/>
  34. </Realm>
  35. <! --详情常见下表(host参数详解)-->
  36. <Host name="localhost" appBase="webapps"
  37. unpackWARs="true" autoDeploy="true">
  38. <!--详情常见下表(Context参数说明) -->
  39. <context path="" docBase="" debug=""/>
  40. <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
  41. prefix="localhost_access_log" suffix=".txt"
  42. pattern="%h %l %u %t &quot;%r&quot; %s %b" />
  43. </Host>
  44. </Engine>
  45. </Service>
  46. </Server>

4、Connector主要参数说明

Web中间件Tomcat详解(qf) - 图3

5、host参数详解

Web中间件Tomcat详解(qf) - 图4

6、context参数说明

Web中间件Tomcat详解(qf) - 图5

5.7 web站点部署

上线的代码有两种方式:

第一种方式是直接将程序目录放在webapps目录下面,这种方式大家已经明白了,就不多说了。

第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面。

1、使用war包部署web站点

war包项目上传到tomcat的webapps目录下即可(略)

2、自定义默认网站目录

上面访问的网址为http://10.0.0.3:8080/memtest/meminfo.jsp(memtest为项目memetest.war)

现在想访问格式为http://10.0.0.3:8080/meminfo.jsp

方法一

将meminfo.jsp 或其他程序放在tomcat/webapps/ROOT目录下即可。因为默认网站根目录为tomcat/webapps/ROOT

方法二(host标签配置context)

  1. vi server.xml
  2. ...
  3. <context path="" docBase="/usr/local/tomcat/webapps/memetest" debug="0" reloadable="false" crossContext="true" />
  • path:指定虚拟目录的名字
  • docBase:虚拟目录的路径(默认为webapps/ROOT绝对路径)
  • debug:日志调试使用(0~9),越大显示信息越详细
  • reloadable:监视项目下class或者WEB-INF目录中是否有变动
  • crossContext:暂且不知

3、部署开源站点(jpress)

jpress官网:http://jpress.io

下载地址:https://github.com/JpressProjects/jpress

  1. 安装数据库
  1. yum -y instal1 mariadb-server
  2. systemctl start mariadb.service
  1. 配置数据库
  1. # 连接到数据库执行一下命令
  2. # 创建数据库和用户jpress
  3. create database jpress DEFAULT CHARACTER SET utf8;
  4. # 授权jpress用户可以访问jpress库下的所有数据,并以localhost本地登陆,密码未123456
  5. grant all on jpress.* to jpress@'localhost' identified by'123456';
  6. flush privileges;
  7. exit
  1. jpress站点上线
  1. 1.准备jpress-v3.2.4.war并上传到tomcat服务器中
  1. 访问并配置向导

Web中间件Tomcat详解(qf) - 图6

。 。 。其他略

5.8 Tomcat安全优化

1、telnet管理保护(强制)

Web中间件Tomcat详解(qf) - 图7

2、ajp连接端口保护(推荐)

Web中间件Tomcat详解(qf) - 图8

3、禁止管理端(强制)

Web中间件Tomcat详解(qf) - 图9

4、降权启动(强制)

Web中间件Tomcat详解(qf) - 图10

  1. useradd tomcat
  2. mkdir /home/tomcat -p
  3. cp -a /application/tomcat /home/tomcat/tomcat8_1
  4. chown -R tomcat.tomcat /home/tomcat/tomcat8_1/
  5. su -c '/home/tomcat/tomcat8_1/bin/startup.sh' tomcat
  6. ps -ef | grep tomcat

5、文件列表访问控制(强制)

Web中间件Tomcat详解(qf) - 图11

6、版本信息隐藏(强制)

Web中间件Tomcat详解(qf) - 图12

7、Server header重写(推荐)

Web中间件Tomcat详解(qf) - 图13

8、访问限制(可选)

Web中间件Tomcat详解(qf) - 图14

9、启停脚本权限回收(推荐)

Web中间件Tomcat详解(qf) - 图15

10、访问日志格式规范(推荐)

Web中间件Tomcat详解(qf) - 图16

11、附录:建议配置及标准执行方案

  1. 配置部分(server.xml)
  1. <server port="8527" shutdown="dangerous ">
  2. <!-- Define a non-SSL HTTP/1.1 connector on port 8080 -->
  3. <connector port="8080" server="webserver" />
  4. <! -- Define an AJP 1.3 connector on port 8528 -->
  5. <! --Define an accesslog -->
  6. <Valve className="org.apache.catalina.va1ves.AccessLogva1ve"
  7. directory="logs"
  8. prefix="1oca1host_access_log."
  9. suffix=".txt"
  10. pattern="%h %1 %u %t %r %s %b %{Referer}i %{User-Agent}i %D"
  11. resolveHosts="false" />
  12. <connector port="8528" protoco1="AJP/1.3”/>
  1. 配置部分(conf/web.xml或WEB-INF/web.xml)
  1. <init-param>
  2. <param-name>1istings</param-name>
  3. <param-value>false</param-value>
  4. </init-param>
  5. <!-- 在</web-app>标签前面添加: -->
  6. <error-page>
  7. <error-code>403</error-code>
  8. <location>/forbidden.jsp</location>
  9. </error-page>
  10. <error-page>
  11. <error-code>404</error-code>
  12. <location>/notfound.jsp</location>
  13. </error-page>
  14. <error-page>
  15. <error-code>500</error-code>
  16. <location>/systembusy.jsp</location>
  17. </error-page>
  1. 删除如下tomcat的默认目录和默认文件
  1. tomcat/webapps/*
  2. tomcat/conf/tomcat-user.xml
  1. 去除其他用户对tomcat启停脚本的执行权限
  1. chmod 744 -R tomcat/bin/*

5.9 Tomcat性能优化

tomcat性能取决于内存大小

1、上策:优化代码

该项需要开发经验足够丰富,对开发人员要求较高

2、中策:jvm机制优化 垃圾回收机制把不需要的内存回收

优化jvm—优化垃圾回收策略

优化catalina.sh配置文件。在catalina.sh配置文件中添加以下代码

  1. # tomcat分配1G内存模板
  2. JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX: Newsize=512m -XX:MaxNewSize=512m"
  3. JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -xms800m -Xmx800m -XX: NewSize=400m -XX:MaXNewSize=400m"
  4. #重启服务
  • headless:是系统的一种配置模式,在系统可能缺少显示设备,键盘或鼠标等外设的情况下,可以使用该模式(依靠系统的计算能力模拟数据)
  • Xms:初始堆大小(建议物理内存的一般)
  • Newsize:jvm启动时新生代内存(最大内存的3/8)

3、下策:加足够大的内存

该项资金投入较大

4、下下策:每天0点定时重启tomcat服务

使用较为广泛

6、Tomcat部署War包实战

部署Jenkins项目

6.1 安装Tomcat

Tomcat服务器在生产环境中主要作为JAVA程序的WEB务器。我们这里以Tomcat + jenkins的部署为例来运行jenkins服。

1、安装JDK8、并配置JAVA_HOME等相关信息(新版本jenkins只有jdk8支持)

  1. JAVA_HOME="/usr/ loca1/jdk"
  2. CLASSPATH=.:$JAVA_HOME/1ib/dt.jar:$JAVA_HOME/lib/tools.jar
  3. PATH=$PATH:"$JAVA_HOME/bin"

2、安装Tomcat,启动Tomcat并访问http://127.0.0.1:8080(这是使用了tomcat8做测试)

3、下载jenkins的war包程序http://mirrors.shu.edu.cnljenkins/war/2.108/jenkins.war

4、将jenksins.war 放到解压后的tomcat的 webapps目录中

5、重启tomcat,并访问http://127.0.0.1/jenkins

6.2 日志格式配置

  1. <Valve className="org.apache.cata1ina.va1ves.AccessLogvalve"
  2. directory="/data0/www/1ogs"
  3. prefix="jenkins-"
  4. suffix="-access_1og"
  5. pattern="%h %1 %u %t %r %s %b %{Referer}i %{User-Agent}i %D"
  6. resolveHosts="false" />

6.3 JVM参数优化

  1. JAVA_OPTS="-Xms4096m -Xmx4096m -xX:NewSize=512m -XX:MaxNewSize=512m"

6.4 开启GC日志

  1. JAVA_OPTS="-XX:+PrintccDetails -XX:+PrintGCDatestamps -xloggc:/data0/1ogs/gc-%t.log"
  2. # 创建gc日志存放路径
  3. mkdir /data0/logs/ -p

6.5 开启JMX端口便于监控

  1. CATALINA_OPTS="SCATALINA_OPTS -Dcom.sun.management.jmxremote
  2. -Dcom.sun.management.jmxremote.port=10028
  3. -Dcom.sun.management.jmxremote.authenticate=false
  4. -Dcom.sun. management.jmxremote.ssl=fa1se
  5. -Djava.rmi.server.hostname=qfedu.com"

6.6 取消JVM的默认DNS缓存时间

不缓存DNS记录,避免DNS解析更改后要重启JVM虚拟机

  1. CATALINA_OPTS="$CATALINA_OPTS -Dsun.net.inetaddr.ttl=0 -Dsun.net.inetaddr.negative.ttl=0"