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/
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; | false为不列出目录文件,ture为允许列出,默认为false; | |
版本信息隐藏 | 1、修改conf/web.xml,重定向403、404以及500等错误到指定的错误页面; 2、也可以通过修改应用程序目录下的WEB-INF/web.xml下的配置进行错误页面的重定向; |
在配置中对一些常见错误进行重定向,避免当出现错误时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两个监控插件: