1. Tomcat安装

1.1 软件准备

JDK下载:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Tomcat下载:http://tomcat.apache.org/

1.2 部署java环境

cd /usr/local/src 

tar zxf jdk-8u40-linux-x64.tar.gz 

mv jdk1.8.0_40 /usr/local/jdk 

chown -R root:root /usr/local/jdk

sed -i.ori '$a export JAVA_HOME=/usr/local/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

source /etc/profile

#→出现下面结果证明部署成功

[root@tomcat ~]# java -version

java version "1.8.0_60"

Java(TM) SE Runtime Environment (build 1.8.0_60-b27)

Java HotSpot(TM) 64-Bit Server VM (build 25.60-b23, mixed mode)


1.3 安装Tomcat


cd /usr/local/src

tar zxf apache-tomcat-8.0.41.tar.gz

mv apache-tomcat-8.0.41 /usr/local/tomcat

echo 'export TOMCAT_HOME=/usr/local/tomcat'>>/etc/profile

source /etc/profile

chown -R root.root /usr/local/dk/ /usr/local/tomcat/

[root@linux-node1 ~]# tail -4 /etc/profile

    export JAVA_HOME=/usr/local/jdk

    export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

    export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar

    export TOMCAT_HOME=/usr/local/tomcat

1.4 Tomcat目录介绍

[root@linux-node1 ~]# cd /usr/local/tomcat/

[root@linux-node1 tomcat]# tree -L 1

.├── bin         #→用以启动、关闭Tomcat或者其它功能的脚本(.bat文件和.sh文件)

 ├── conf        #→用以配置Tomcat的XML及DTD文件

 ├── lib         #→存放web应用能访问的JAR包

 ├── LICENSE

 ├── logs        #→Catalina和其它Web应用程序的日志文件

 ├── NOTICE

 ├── RELEASE-NOTES

 ├── RUNNING.txt

 ├── temp        #→临时文件

 ├── webapps        #→Web应用程序根目录

 └── work        #→用以产生有JSP编译出的Servlet的.java和.class文件

 7 directories, 4 files

[root@linux-node1 tomcat]# cd webapps/

[root@linux-node1 webapps]# ll

总用量 20

drwxr-xr-x 14 root root 4096 Oct  5 12:09 docs     #→tomcat帮助文档

drwxr-xr-x  6 root root 4096 Oct  5 12:09 examples #→web应用实例

drwxr-xr-x  5 root root 4096 Oct  5 12:09 host-manager #→管理

drwxr-xr-x  5 root root 4096 Oct  5 12:09 manager  #→管理

drwxr-xr-x  3 root root 4096 Oct  5 12:09 ROOT     #→默认网站根目录 

1.5 启动Tomcat

[root@linux-node1 ~]# /usr/local/tomcat/bin/startup.sh 

Using CATALINA_BASE:   /usr/local/tomcat

Using CATALINA_HOME:   /usr/local/tomcat

Using CATALINA_TMPDIR: /usr/local/tomcat/temp

Using JRE_HOME:        /usr/local/jdk

Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

Tomcat started.

[root@linux-node1 ~]# ps aux | grep java

root      33752 89.7 13.9 2273300 139996 pts/0  Sl   02:57   0:08 /usr/local/jdk/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=10.20.23.249 -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start

root      33772  0.0  0.0 103260   840 pts/0    S+   02:57   0:00 grep java

1.6 访问网站

网址:http://10.20.23.250:8080/

JAVA企业级应用Tomcat实战_第1张图片

1.7 Tomcat日志

[root@linux-node2 tomcat]# cd logs/

[root@linux-node2 logs]# ll

总用量 24

-rw-r--r-- 1 root root 6292 3月  15 22:13 catalina.2017-03-15.log

-rw-r--r-- 1 root root 6292 3月  15 22:13 catalina.out

-rw-r--r-- 1 root root    0 3月  15 22:13 host-manager.2017-03-15.log

-rw-r--r-- 1 root root  284 3月  15 22:13 localhost.2017-03-15.log

-rw-r--r-- 1 root root  728 3月  15 22:13 localhost_access_log.2017-03-15.txt

-rw-r--r-- 1 root root    0 3月  15 22:13 manager.2017-03-15.log

[root@linux-node2 logs]# tailf catalina.out

15-Mar-2017 22:13:27.923 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/tomcat/webapps/examples has finished in 548 ms

15-Mar-2017 22:13:27.923 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /usr/local/tomcat/webapps/host-manager

15-Mar-2017 22:13:27.972 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/tomcat/webapps/host-manager has finished in 49 ms

15-Mar-2017 22:13:27.973 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /usr/local/tomcat/webapps/docs

15-Mar-2017 22:13:28.015 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/tomcat/webapps/docs has finished in 41 ms

15-Mar-2017 22:13:28.015 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory /usr/local/tomcat/webapps/ROOT

15-Mar-2017 22:13:28.050 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory /usr/local/tomcat/webapps/ROOT has finished in 35 ms

15-Mar-2017 22:13:28.056 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]

15-Mar-2017 22:13:28.066 信息 [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]

15-Mar-2017 22:13:28.072 信息 [main] org.apache.catalina.startup.Catalina.start Server startup in 1544 ms

^C

[root@linux-node2 logs]# ll

总用量 24

-rw-r--r-- 1 root root 6292 3月  15 22:13 catalina.2017-03-15.log

-rw-r--r-- 1 root root 6292 3月  15 22:13 catalina.out

-rw-r--r-- 1 root root    0 3月  15 22:13 host-manager.2017-03-15.log

-rw-r--r-- 1 root root  284 3月  15 22:13 localhost.2017-03-15.log

-rw-r--r-- 1 root root  728 3月  15 22:13 localhost_access_log.2017-03-15.txt

-rw-r--r-- 1 root root    0 3月  15 22:13 manager.2017-03-15.log

[root@linux-node2 logs]# cat localhost.2017-03-15.log 

15-Mar-2017 22:13:27.910 信息 [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log ContextListener: contextInitialized()

15-Mar-2017 22:13:27.910 信息 [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log SessionListener: contextInitialized()

[root@linux-node2 logs]# cat localhost_access_log.2017-03-15.txt 

10.20.23.1 - - [15/Mar/2017:22:13:55 +0800] "GET / HTTP/1.1" 200 11250

10.20.23.1 - - [15/Mar/2017:22:13:55 +0800] "GET /tomcat.css HTTP/1.1" 200 5581

10.20.23.1 - - [15/Mar/2017:22:13:55 +0800] "GET /tomcat.png HTTP/1.1" 200 5103

10.20.23.1 - - [15/Mar/2017:22:13:55 +0800] "GET /bg-upper.png HTTP/1.1" 200 3103

10.20.23.1 - - [15/Mar/2017:22:13:55 +0800] "GET /bg-middle.png HTTP/1.1" 200 1918

10.20.23.1 - - [15/Mar/2017:22:13:55 +0800] "GET /bg-button.png HTTP/1.1" 200 713

10.20.23.1 - - [15/Mar/2017:22:13:55 +0800] "GET /asf-logo-wide.svg HTTP/1.1" 200 26447

10.20.23.1 - - [15/Mar/2017:22:13:55 +0800] "GET /bg-nav.png HTTP/1.1" 200 1401

10.20.23.1 - - [15/Mar/2017:22:13:55 +0800] "GET /favicon.ico HTTP/1.1" 200 21630


2. Tomcat配置文件

2.1 Tomcat配置文件

[root@linux-node2 conf]# pwd

/usr/local/tomcat/conf

[root@linux-node2 conf]# ll

总用量 220

drwxr-xr-x 3 root root   4096 3月  15 22:13 Catalina

-rw------- 1 root root  12767 1月  19 06:25 catalina.p olicy

-rw------- 1 root root   7125 1月  19 06:25 catalina.properties

-rw------- 1 root root   1577 1月  19 06:25 context.xml

-rw------- 1 root root   3387 1月  19 06:25 logging.properties

-rw------- 1 root root   6458 1月  19 06:25 server.xml   #主配置文件

-rw------- 1 root root   2164 1月  19 06:25 tomcat-users.xml  ##tomcat管理用户配置文件

-rw------- 1 root root   2634 1月  19 06:25 tomcat-users.xsd

-rw------- 1 root root 168378 1月  19 06:25 web.xml

2.2 Tomcat管理

测试功能,生产环境不要用。

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


[root@linux-node2 conf]# vim /usr/local/tomcat/conf/tomcat-users.xml

 .........

 #→在此行前加入上面三行


[root@linux-node2 conf]# /usr/local/tomcat/bin/shutdown.sh 

[root@linux-node2 conf]# /usr/local/tomcat/bin/startup.sh  

2.3 Tomcat主配置文件Server.xml详解

2.3.1 server.xml组件类别

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

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

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

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


2.3.2 组件详解

  • engine:核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host。

  • host:类似于httpd中的虚拟主机,一般而言支持基于FQDN的虚拟主机。

  • context:定义一个应用程序,是一个最内层的容器类组件(不能再嵌套)。配置context的主要目的指定对应对的webapp的根目录,类似于httpd的alias,其还能为webapp指定额外的属性,如部署方式等。

  • connector:接收用户请求,类似于httpd的listen配置监听端口的。

  • service(服务):将connector关联至engine,因此一个service内部可以有多个connector,但只能有一个引擎engine。service内部有两个connector,一个engine。因此,一般情况下一个server内部只有一个service,一个service内部只有一个engine,但一个service内部可以有多个connector。

  • server:表示一个运行于JVM中的tomcat实例。

  • Valve:阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任何容器中,比如记录日志(access log valve)、基于IP做访问控制(remote address filter valve)。

  • logger:日志记录器,用于记录组件内部的状态信息,可以用于除context外的任何容器中。

  • realm:可以用于任意容器类的组件中,关联一个用户认证库,实现认证和授权。可以关联的认证库有两种:UserDatabaseRealm、MemoryRealm和JDBCRealm。

  • UserDatabaseRealm:使用JNDI自定义的用户认证库。

  • MemoryRealm:认证信息定义在tomcat-users.xml中。

  • JDBCRealm:认证信息定义在数据库中,并通过JDBC连接至数据库中查找认证用户。



3. Tomcat安全优化和性能优化

3.1 安全优化

  • 降权启动

  • telnet管理端口保护

  • ajp连接端口保护

  • 禁用管理端

类别 配置内容及说明 标准配置 备注
telnet管理端口保护

1、修改默认的8005管理端口为不易猜测的端口(大于1024);

2、修改Shutdown指令为其他字符串


1、以上配置项的配置内容只是建议配置,可以按照服务实际情况进行合理配置,但要求端口配置在8000-8999之间;

Ajp连接端口保护

1、修改默认的ajp 8009端口为不易冲突的大于1024的端口;

2、通过iptables规则限制ajp端口访问的权限仅为线上机器;


以上配置项的配置内容仅为建议配置,请按照访问实际情况进行合理配置,但要求端口配置在8000-8999之间;保护此端口的目的在于防止线下的测试流量被mod_jk转发至线上tomcat服务器;
禁用管理端

1、删除默认的{Tomcat 安装目录}/conf/tomcat-users.xml文件后将会自动生成新的文件;

2、删除{tomcat安装目录}/webapps下默认的所有目录和文件;

3、将tomcat应用根目录配置为tomcat安装目录以外的目录;

对于前端web模块,tomcat管理端属于tomcat的高危安全隐患,一旦被攻破,***通过上传web shell的方式将会直接服务器的控制权,后果极其严重;
降权启动

1、tomcat启动用户权限必须为非root权限,尽量降低tomcat启动用户的目录访问权限;

2、如需直接对外使用80端口,可通过普通账号启动后,配置iptables规则进行转发;

- 避免一旦tomcat访问被***,***直接获取高级用户权限危害整个server的安全;
文件列表访问控制
1、conf/web.xml文件中default部分listings的配置必须为false;


listings false



false为不列出目录文件,ture为允许列出,默认为false;
版本信息隐藏

1、修改conf/web.xml,重定向403、404以及500等错误到指定的错误页面;

2、也可以通过修改应用程序目录下的WEB-INF/web.xml下的配置进行错误页面的重定向;


403 /forbidden.jsp

404 /notfound.jsp

500 /systembusy.jsp



在配置中对一些常见错误进行重定向,避免当出现错误时tomcat默认显示的错误页面暴露服务器和版本信息;

必须确保程序根目录下的错误页面已经存在;

Server header 重写 在HTTP Connector配置中加入server的配置;  server="webserver"

当tomcat HTTP端口直接提供web服务时此配置生效,加入此配置,将会替换http响应server header部分的默认配置,默认是Apache-Coyote/1.1

访问限制 通过配置,限定访问的ip来源

通过配置信任ip的白名单,拒绝非白名单ip的访问,此配置主要是针对高保密级别的系统,一般产品级不需要;
启停脚本权限回收 去除其他用户对Tomcat的bin目录下shutdown.sh、startup.sh、catalina.sh的可执行权限; chmod -R 744 tomcat/bin/* 防止其他用户有起停线上tomcat的权限;
访问日志格式规范 开启Tomcat默认访问日志中的Referer和User-Agent记录


开启Referer和User-Agent是为了一旦出现安全问题能够更好的根据日志进行问题排查;


4. WEB站点部署

上线的代码有两种方式,第一种方式是直接将程序目录放在webapps目录下面,这种方式大家已经明白了,就不多说了。第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面。下面让我们见识一下这种方式。

4.1 使用war包部署web站点

[root@linux-node1 webapps]# pwd

/application/tomcat/webapps

[root@linux-node1 webapps]# rz  

#→上传memtest.war

[root@linux-node1 webapps]# ls

docs  examples  host-manager  manager  memtest  memtest.war  ROOT

浏览器访问:http://10.20.23.249:8080/memtest/meminfo.jsp

4.2 自定义默认网站目录

上面访问的网址为http://10.20.23.249:8080/memtest/meminfo.jsp  
现在我想访问格式为http://10.20.23.249:8080/meminfo.jsp  
怎么破?

方法一

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

方法二

[root@linux-node1 ~]# vim /application/tomcat/conf/server.xml

      

           unpackWARs="true" autoDeploy="true">

        

[root@linux-node1 ~]# /application/tomcat/bin/shutdown.sh

[root@linux-node1 ~]# /application/tomcat/bin/startup.sh


5. Tomcat监控

首先学习下jvm的几个比较有用的命令:

5.1.1 jsp

作用:快速获取java进程的PID

[root@linux-node1 ~]# jps      ##只显示java进程

13937 Bootstrap

24004 Jps

[root@linux-node1 ~]# jps -lvm

13937 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp

24027 sun.tools.jps.Jps -lvm -Denv.class.path=.:/usr/local/jdk/lib/:/usr/local/jdk/jre/lib:/usr/local/jdk/lib/tools.jar -Dapplication.home=/usr/local/jdk -Xms8m


5.1.2jstack

作用:打印所有的java进程的运行状态信息

[root@linux-node1 ~]# jstack 13937 > 13937.txt

[root@linux-node1 ~]# ll

总用量 92

-rw-r--r--  1 root root 49464 1月  18 15:54 13937.txt

-rw-------. 1 root root  1098 1月   3 16:58 anaconda-ks.cfg

-rw-r--r--. 1 root root 23040 1月   3 16:58 install.log

-rw-r--r--. 1 root root  6240 1月   3 16:57 install.log.syslog

[root@linux-node1 ~]# ll -lh 13937.txt

-rw-r--r-- 1 root root 49K 1月  18 15:54 13937.txt

[root@linux-node1 ~]# top -H -p 13937

top - 15:56:02 up 1 day, 28 min,  2 users,  load average: 0.02, 0.02, 0.00

Tasks:  65 total,   0 running,  65 sleeping,   0 stopped,   0 zombie

Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:   1004412k total,   923476k used,    80936k free,    42528k buffers

Swap:  1023992k total,    23424k used,  1000568k free,   156160k cached

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

13937 root      20   0 2401m 429m  18m S  0.0 43.8   0:00.01 java

13938 root      20   0 2401m 429m  18m S  0.0 43.8   0:00.82 java

13939 root      20   0 2401m 429m  18m S  0.0 43.8   0:06.48 java

13940 root      20   0 2401m 429m  18m S  0.0 43.8   0:00.07 java

13941 root      20   0 2401m 429m  18m S  0.0 43.8   0:00.03 java

13942 root      20   0 2401m 429m  18m S  0.0 43.8   0:00.06 java

13943 root      20   0 2401m 429m  18m S  0.0 43.8   0:32.91 java

13944 root      20   0 2401m 429m  18m S  0.0 43.8   0:08.24 java

13945 root      20   0 2401m 429m  18m S  0.0 43.8   0:00.00 java

13946 root      20   0 2401m 429m  18m S  0.0 43.8   0:35.81 java

13947 root      20   0 2401m 429m  18m S  0.0 43.8   0:02.27 java

13948 root      20   0 2401m 429m  18m S  0.0 43.8   0:00.00 java

[root@linux-node1 ~]# echo "obase=16; 13945" | bc

3679

[root@linux-node1 ~]# ll

总用量 92

-rw-r--r--  1 root root 49464 1月  18 15:54 13937.txt

-rw-------. 1 root root  1098 1月   3 16:58 anaconda-ks.cfg

-rw-r--r--. 1 root root 23040 1月   3 16:58 install.log

-rw-r--r--. 1 root root  6240 1月   3 16:57 install.log.syslog

[root@linux-node1 ~]# less 13937.txt

...skipping...

"Service Thread" #7 daemon prio=9 os_prio=0 tid=0x00007fd5f80b5000 nid=0x3679 runnable [0x0000000000000000]

java.lang.Thread.State: RUNNABLE


5.1.3 jmap

打印出整个java堆内存的所有东西


5.2 监控

5.2.1 修改配置文件

[root@linux-node1 ~]# vim /usr/local/tomcat/bin/catalina.sh     ##加入以下内容


CATALINA_OPTS="$CATALINA_OPTS

-Dcom.sun.management.jmxremote

-Dcom.sun.management.jmxremote.port=12345

-Dcom.sun.management.jmxremote.authenticate=false

-Dcom.sun.management.jmxremote.ssl=false

-Djava.rmi.server.hostname=10.20.23.249"

5.2.2 重启tomcat

[root@linux-node1 ~]# /usr/local/tomcat/bin/shutdown.sh 

Using CATALINA_BASE:   /usr/local/tomcat

Using CATALINA_HOME:   /usr/local/tomcat

Using CATALINA_TMPDIR: /usr/local/tomcat/temp

Using JRE_HOME:        /usr/local/jdk

Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

[root@linux-node1 ~]# /usr/local/tomcat/bin/startup.sh 

Using CATALINA_BASE:   /usr/local/tomcat

Using CATALINA_HOME:   /usr/local/tomcat

Using CATALINA_TMPDIR: /usr/local/tomcat/temp

Using JRE_HOME:        /usr/local/jdk

Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar

Tomcat started.

5.2.3 监控

在win7上安装jdk,打开jdk的安装目录(D:\Program Files\Java\jdk1.8.0_121\bin)

双击打开jconsole和jvisualvm两个监控插件:

JAVA企业级应用Tomcat实战_第2张图片


JAVA企业级应用Tomcat实战_第3张图片