1.1Tomcat简介

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
Tomcat是一个web服务器,类似nginx,Apache的http,nginx,http只能处理html等静态文件(jpg)。
Tomcat可以处理静态的html文件

1.2 Tomcat安装

准备

[root@LJS tools]# ll
总用量 8650396
-rw-r--r-- 1 root root    8491533 10月 23 14:47 apache-maven-3.3.9-bin.tar.gz
-rw-r--r-- 1 root root    9128610 10月 23 14:47 apache-tomcat-8.0.27.tar.gz
-rw-r--r-- 1 qemu qemu 4329570304 10月 23 10:39 CentOS7_2.iso
-rw-r--r-- 1 qemu qemu 4329570304 10月 20 19:38 CentOS-7-x86_64-DVD-1511.iso
-rw-r--r-- 1 root root  181238643 10月 23 14:47 jdk-8u60-linux-x64.tar.gz
[root@LJS tools]#

1.2.1 安装JDK

JDK相当于Java虚拟机(jvm)-出编译处处使用

[root@LJS tools]# tar xf jdk-8u60-linux-x64.tar.gz -C /application/
[root@LJS tools]# ln -s /application/jdk1.8.0_60 /application/jdk
[root@LJS tools]# sed -i.ori '$a export JAVA_HOME=/application/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexportCLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
[root@LJS tools]# source /etc/profile
[root@LJS tools]# 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)
[root@LJS tools]#

1.2.2 安装Tomcat

[root@LJS tools]# tar xf apache-tomcat-8.0.27.tar.gz -C /application/
[root@LJS tools]# ln -s /application/apache-tomcat-8.0.27 /application/tomcat
[root@LJS tools]# echo 'export TOMCAT_HOME=/application/tomcat'>>/etc/profile
[root@LJS tools]# source /etc/profile   
[root@LJS tools]# chown -R root.root /application/jdk/ /application/tomcat/
[root@LJS tools]#  tail -4 /etc/profile
export JAVA_HOME=/application/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export TOMCAT_HOME=/application/tomcat
[root@LJS tools]#
查看
[root@LJS tools]# /application/tomcat/bin/version.sh 
Using CATALINA_BASE:   /application/tomcat
Using CATALINA_HOME:   /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME:        /application/jdk
Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.0.27
Server built:   Sep 28 2015 08:17:25 UTC
Server number:  8.0.27.0
OS Name:        Linux
OS Version:     3.10.0-327.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_60-b27
JVM Vendor:     Oracle Corporation
[root@LJS tools]#

1.2.3 Tomcat目录结构

[root@LJS tools]# cd /application/tomcat/
[root@LJS tomcat]# tree -L 1
.
├── bin             #启动文件目录,startup.sh ,shutdown.sh。catalina.sh(核心)
├── conf                #配置文件目录,Server.xml(主配置文件)
├── lib             #
├── LICENSE         #
├── logs                #日志目录
├── NOTICE          #
├── RELEASE-NOTES   #
├── RUNNING.txt     #
├── temp                #临时目录
├── webapps         #站点存放目录
└── work                #用以产生有JSP编译出的Servlet的.java和.class文件

7 directories, 4 files
[root@LJS tomcat]#
[root@tomcat tomcat]# cd webapps/
[root@tomcat webapps]# ll
total 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.2.4 启动关闭

[root@LJS ~]# /application/tomcat/bin/startup.sh启动
Using CATALINA_BASE:   /application/tomcat
Using CATALINA_HOME:   /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME:        /application/jdk
Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@LJS ~]#
[root@LJS ~]# /application/tomcat/bin/shutdown.sh 关闭
Using CATALINA_BASE:   /application/tomcat
Using CATALINA_HOME:   /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME:        /application/jdk
Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
[root@LJS ~]#

日志

[root@LJS logs]# ll
总用量 40
-rw-r--r-- 1 root root 13215 10月 23 23:20 catalina.2017-10-23.log 日志切割文件
-rw-r--r-- 1 root root 13215 10月 23 23:20 catalina.out 实时记录运行信息,文件越来越大,定时情况
-rw-r--r-- 1 root root     0 10月 23 23:19 host-manager.2017-10-23.log
-rw-r--r-- 1 root root   836 10月 23 23:20 localhost.2017-10-23.log
-rw-r--r-- 1 root root  2076 10月 23 23:33 localhost_access_log.2017-10-23.txt
-rw-r--r-- 1 root root     0 10月 23 23:19 manager.2017-10-23.log
[root@LJS logs]#

1.3 启动慢的原因

1.现象
        在CentOS启动Tomcat时,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的。Tocmat的Session ID是通过SHA1算法计算得到的,计算Session ID的时候必须有一个密钥。为了提高安全性Tomcat在启动的时候回通过随机生成一个密钥。 
22-Apr-2017 19:33:07.623 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of
 SecureRandom instance for session ID generation using [SHA1PRNG] took [55,507] milliseconds.
22-Apr-2017 19:33:07.653 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web appli
cation directory /application/apache-tomcat-8.0.27/webapps/ROOT has finished in 55,935 ms
主要原因是生成随机数的时候卡住了,导致tomcat启动不了。
是否有足够的熵来用于产生随机数,可以通过如下命令来查看
[root@oldboy tools]# cat /proc/sys/kernel/random/entropy_avail
7
为了加速/dev/random提供随机数的速度,你可以通过操作设备的外设,让其产生大量的中断(如网络传输数据,按键,移动鼠标,在命令行敲几个不同的命令,俗称聚气。
cat /dev/random 会消耗能量
方法1:
vim $JAVA_HOME/jre/lib/security/java.security
securerandom.source=file:/dev/random
改为
securerandom.source=file:/dev/urandom
方法2:
vim $TOMCAT_HOME/bin/catalina.sh
if [[ "$JAVA_OPTS" != *-Djava.security.egd=* ]]; then
    JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/urandom"
fi
这个系统属性egd表示熵收集守护进程(entropy gathering daemon)
方法3:
yum install rng-tools # 安装rngd服务(熵服务,增大熵池)
systemctl start rngd  # 启动服务

1.4 通过web管理Tomcat(测试环境,不能再生产环境使用)

测试环境使用方法:把Tomcat搭建完成,交给开发使用
Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能,就需要配置管理用户,即配置前面说过的tomcat-users.xml。
[root@LJS ~]# sed -i.ori '$i <role rolename="manager-gui"/>\n<role rolename="admin-gui"/>\n<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>' /application/tomcat/conf/tomcat-users.xml
[root@LJS ~]# tail -4 /application/tomcat/conf/tomcat-users.xml
<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui"/>
</tomcat-users>
[root@LJS ~]#  /application/tomcat/bin/shutdown.sh 
Using CATALINA_BASE:   /application/tomcat
Using CATALINA_HOME:   /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME:        /application/jdk
Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
[root@LJS ~]#  /application/tomcat/bin/startup.sh
Using CATALINA_BASE:   /application/tomcat
Using CATALINA_HOME:   /application/tomcat
Using CATALINA_TMPDIR: /application/tomcat/temp
Using JRE_HOME:        /application/jdk
Using CLASSPATH:       /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar
Tomcat started.
[root@LJS ~]#

管理界面
Tomcat部署
war使用Java命令大的压缩包
war包使用被Java程序解压
Tomcat部署
Tomcat部署

Tomcat部署

1.5 搭建jpress-Java版本的WordPress

wordpress 是jsp网页

1.5.1 安装mariadb数据库

[root@LJS ~]# yum install mariadb-server -y
启动数据库
[root@LJS ~]# systemctl start mariadb.service
创建数据库
MariaDB [(none)]> create database jpress DEFAULT CHARACTER SET utf8;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all on jpress.* to jpress@'10.0.0.8' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]>

1.5.2 部署站点代码

jpress-web-newest.war上传这个包
改名:[root@LJS webapps]# mv jpress-web-newest jpress
[root@LJS webapps]#
http://10.0.0.200:8080/jpress/install

Tomcat部署
Tomcat部署
Tomcat部署

Tomcat部署

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

1.6.1 server.xml组件类别

  • 顶级组件:位于整个配置的顶层,如server。
  • 容器类组件:可以包含其它组件的组件,如service、engine、host、context。
  • 连接器组件:连接用户请求至tomcat,如connector。
  • 被嵌套类组件:位于一个容器当中,不能包含其他组件,如Valve、logger。

    1.6.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连接至数据库中查找认证用户。

    1.6.3 配置文件详解

    语法:
    注释<!--开头 -->结尾
    中间包含的都是注释,是段注释
    <Server port="8005" shutdown="SHUTDOWN"> #指定关闭Tomcat的端口号及暗号
    <Server>元素代表整个容器,是Tomcat实例的顶层元素.由org.apache.catalina.Server接口来定义.它包含一个<Service>元素.并且它不能做为任何元素的子元素.
    port指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令.该属性是必须的.
    shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置
    -->
    <Connector port="8080" protocol="HTTP/1.1" #指定Tomcat监听的端口
               connectionTimeout="20000"
               redirectPort="8443" />   
    </GlobalNamingResources>
    <!--service服务组件-->
    <Service name="Catalina">
    <!--
    connector:接收用户请求,类似于httpd的listen配置监听端口.
        port指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求。
        address:指定连接器监听的地址,默认为所有地址(即0.0.0.0)
        protocol连接器使用的协议,支持HTTP和AJP。AJP(Apache Jserv Protocol)专用于tomcat与apache建立通信的, 在httpd反向代理用户请求至tomcat时使用(可见Nginx反向代理时不可用AJP协议)。
        minProcessors服务器启动时创建的处理请求的线程数
        maxProcessors最大可以创建的处理请求的线程数
        enableLookups如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
        redirectPort指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
        acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
        connectionTimeout指定超时的时间数(以毫秒为单位)
    -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
    <!--engine,核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host
        defaultHost指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的
    -->
    <Engine name="Catalina" defaultHost="localhost">
      <!--Realm表示存放用户名,密码及role的数据库-->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>
      <!--
      host表示一个虚拟主机
        name指定主机名
        appBase应用程序基本目录,即存放应用程序的目录.一般为appBase="webapps" ,相对于CATALINA_HOME而言的,也可以写绝对路径。
        unpackWARs如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序
        autoDeploy:在tomcat启动时,是否自动部署。
        xmlValidation:是否启动xml的校验功能,一般xmlValidation="false"。
        xmlNamespaceAware:检测名称空间,一般xmlNamespaceAware="false"。
      -->
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <!--
        Context表示一个web应用程序,通常为WAR文件
            docBase应用程序的路径或者是WAR文件存放的路径,也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径。
            path表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/****
            reloadable这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序
        -->
        <Context path="" docBase="" debug=""/>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
    </Engine>
    </Service>
    </Server>

    1.7 自定义网站目录

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

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

方法二更改配置文件

[root@LJS webapps]# sed -i.ori '125a <Context path="" docBase="/application/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/>' /application/tomcat/conf/server.xml
 debug="0" reloadable="false" crossContext="true"/>' /application/tomcat/conf/server.xml
[root@LJS webapps]# 
[root@LJS webapps]# sed -i.ori2 '126a <Context path="39class" docBase="/application/tomcat/webapps/memtest" debug="0" ```
reloadable="false" crossContext="true"/>' /application/tomcat/conf/server.xml
[root@LJS webapps]#
[root@LJS webapps]# /application/tomcat/bin/shutdown.sh
[root@LJS webapps]# /application/tomcat/bin/startup.sh

Tomcat部署

1.8 Tomcat多实例

多虚拟机:nginx
多实例:Tomcat,尽可能使用我们系统的资源(资源相对多)

[root@LJS tomcat]# cd /application/tools/
[root@LJS tools]# tar xf apache-tomcat-8.0.27.tar.gz
[root@LJS tools]# cp -a apache-tomcat-8.0.27 tomcat8_1
[root@LJS tools]# cp -a apache-tomcat-8.0.27 tomcat8_2
[root@LJS tools]#
[root@LJS tools]# sed -i 's#8005#8011#;s#8080#8081#' tomcat8_1/conf/server.xml
[root@LJS tools]# sed -i 's#8005#8012#;s#8080#8082#' tomcat8_2/conf/server.xml
将已经配置好的实例打包以后方便批量配置多实例。
[root@LJS tools]# mv tomcat8_1/ tomcat8_2/ /application/
启动:
[root@LJS tools]# /application/tomcat8_1/bin/startup.sh
[root@LJS tools]# /application/tomcat8_2/bin/startup.sh
[root@LJS tools]# netstat -tunlp |grep java
tcp6       0      0 :::8009                 :::*                    LISTEN      3318/jav           
tcp6       0      0 127.0.0.1:8011          :::*                    LISTEN      3769/jav           
tcp6       0      0 127.0.0.1:8012          :::*                    LISTEN      3779/jav           
tcp6       0      0 :::8080                 :::*                    LISTEN      3318/jav           
tcp6       0      0 :::8081                 :::*                    LISTEN      3769/jav           
tcp6       0      0 :::8082                 :::*                    LISTEN      3779/jav           
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      3318/jav           
[root@LJS tools]#

1.9 Tomcat集群

安装

[root@LJS default.d]# yum -y install nginx
修改配置文件
upstream web_pools {
    server 10.0.0.200:8081;
    server 10.0.0.200:8082;
            }

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
                index  index.jsp index.html index.htm;
                proxy_pass http://web_pools;
        }

检查启动

[root@LJS nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@LJS nginx]#
[root@LJS nginx]# systemctl start nginx.service

1.10 Tomcat监控

1.10.1 jps命令监控

-q 仅输出VM标识符,不包括class name,jar name,arguments in main method 
-m 输出main method的参数 
-l 输出完全的包名,应用主类名,jar的完全路径名 
-v 输出jvm参数 
-V 输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件 
-Joption 传递参数到vm,例如:-J-Xms48m
查看当前Java进程
[root@LJS logs]# jps -lvm
3779 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat8_2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat8_2/endorsed -Dcatalina.base=/application/tomcat8_2 -Dcatalina.home=/application/tomcat8_2 -Djava.io.tmpdir=/application/tomcat8_2/temp
3318 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat/endorsed -Dcatalina.base=/application/tomcat -Dcatalina.home=/application/tomcat -Djava.io.tmpdir=/application/tomcat/temp
4440 sun.tools.jps.Jps -lvm -Denv.class.path=.:/application/jdk/lib:/application/jdk/jre/lib:/application/jdk/lib/tools.jar -Dapplication.home=/application/jdk1.8.0_60 -Xms8m
3769 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat8_1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat8_1/endorsed -Dcatalina.base=/application/tomcat8_1 -Dcatalina.home=/application/tomcat8_1 -Djava.io.tmpdir=/application/tomcat8_1/temp
[root@LJS logs]#

1.10.2 监控脚本

[root@LJS tools]# sh show-busy-java-threads.sh 
[1] Busy(0.1%) thread(3797/0xed5) stack of java process(3779) under user(root):
"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007f80640b3800 nid=0xed5 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

[2] Busy(0.1%) thread(3792/0xed0) stack of java process(3769) under user(root):
"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007feb740b3800 nid=0xed0 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

[3] Busy(0.1%) thread(3329/0xd01) stack of java process(3318) under user(root):
"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 tid=0x00007f13500b3800 nid=0xd01 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

[4] Busy(0.0%) thread(4304/0x10d0) stack of java process(3779) under user(root):
"http-nio-8082-exec-10" #29 daemon prio=5 os_prio=0 tid=0x00007f8010008000 nid=0x10d0 waiting on condition [0x00007f800fefd000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000c61651b8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:103)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:31)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
[5] Busy(0.0%) thread(3870/0xf1e) stack of java process(3779) under user(root):
"http-nio-8082-exec-9" #28 daemon prio=5 os_prio=0 tid=0x00007f8010005000 nid=0xf1e waiting on condition [0x00007f800fffe000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000c61651b8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:103)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:31)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
[root@LJS tools]#
[root@LJS tomcat]# vim /application/tomcat8_1/conf/server.xml
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.0.0.200"
[root@LJS tomcat]# echo "10.0.0.200 LJS" /etc/hosts
[root@LJS tomcat]# /application/tomcat8_1/bin/shutdown.sh
[root@LJS tomcat]# /application/tomcat8_1/bin/startup.sh
[root@LJS tomcat]# netstat -tunlp|grep 12345
tcp6       0      0 :::12345                :::*                    LISTEN      5307/java           
[root@LJS tomcat]#
重启不显示端口查看日志报错显示没有做hosts解析,所以添加一条hosts解析

1.10.3 Windows监控

C:\Program Files\Java\jdk1.8.0_31\bin 
两个软件
jconsole
jvisualvm

Tomcat部署

Tomcat部署

1.10.4 zabbix监控Tomcat

1.安装软件包zabbix监控m01机器

[root@m01 ~]# rpm -qa zabbix-java-gateway
zabbix-java-gateway-3.0.9-1.el6.x86_64
[root@m01 ~]#

原理图
Tomcat部署

2.配置zabbix serve

[root@m01 ~]# sed -i -e '217a JavaGateway=127.0.0.1' -e '225a JavaGatewayPort=10052'  -e '235a StartJavaPollers=5' /etc/zabbix/zabbix_server.conf
[root@m01 ~]#
[root@m01 ~]# egrep -n '^J|^St' /etc/zabbix/zabbix_server.conf
218:JavaGateway=127.0.0.1
227:JavaGatewayPort=10052
238:StartJavaPollers=5
[root@m01 ~]#

3启动查看

[root@m01 ~]#  /etc/init.d/zabbix-java-gateway start
Starting zabbix java gateway:                              [  OK  ]
[root@m01 ~]#  /etc/init.d/zabbix-server restart
Shutting down Zabbix server:                               [  OK  ]
Starting Zabbix server:                                    [  OK  ]
[root@m01 ~]#
[root@m01 ~]# netstat -luntp | grep java
tcp        0      0 :::10052                    :::*                        LISTEN      2053/java           
[root@m01 ~]# netstat -luntp | grep 10052
tcp        0      0 :::10052                    :::*                        LISTEN      2053/java           
[root@m01 ~]#

Tomcat部署
Tomcat部署
Tomcat部署

1.11 Tomcat优化

1.11.1 安全优化

降权启动:降低Tomcat启动权限

[root@LJS tomcat]# useradd tomcat
[root@LJS tomcat]# cp -a /application/tomcat8_
tomcat8_1/ tomcat8_2/ 
[root@LJS tomcat]# cp -a /application/tomcat8_2/ /home/tomcat/
[root@LJS tomcat]# chown -R tomcat.tomcat /home/tomcat/tomcat8_2/
[root@LJS tomcat]# su - tomcat 
[tomcat@LJS ~]$ ls
tomcat8_2
[tomcat@LJS ~]$ tomcat8_2/bin/startup.sh 
Using CATALINA_BASE:   /home/tomcat/tomcat8_2
Using CATALINA_HOME:   /home/tomcat/tomcat8_2
Using CATALINA_TMPDIR: /home/tomcat/tomcat8_2/temp
Using JRE_HOME:        /application/jdk
Using CLASSPATH:       /home/tomcat/tomcat8_2/bin/bootstrap.jar:/home/tomcat/tomcat8_2/bin/tomcat-juli.jar
Tomcat started.
[tomcat@LJS ~]$ ps -ef | grep tomcat
root       2715   1513  0 09:27 pts/0    00:00:00 tailf /application/tomcat/logs/catalina.out
root       3779      1  0 10:12 pts/1    00:00:21 /application/jdk/bin/java -Djava.util.logging.config.file=/application/tomcat8_2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat8_2/endorsed -classpath /application/tomcat8_2/bin/bootstrap.jar:/application/tomcat8_2/bin/tomcat-juli.jar -Dcatalina.base=/application/tomcat8_2 -Dcatalina.home=/application/tomcat8_2 -Djava.io.tmpdir=/application/tomcat8_2/temp org.apache.catalina.startup.Bootstrap start
root       5127      1  0 11:29 pts/1    00:00:16 /application/jdk/bin/java -Djava.util.logging.config.file=/application/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat/endorsed -classpath /application/tomcat/bin/bootstrap.jar:/application/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/application/tomcat -Dcatalina.home=/application/tomcat -Djava.io.tmpdir=/application/tomcat/temp org.apache.catalina.startup.Bootstrap start
root       5307      1  1 11:31 pts/1    00:00:36 /application/jdk/bin/java -Djava.util.logging.config.file=/application/tomcat8_1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -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.0.0.200 -Djava.endorsed.dirs=/application/tomcat8_1/endorsed -classpath /application/tomcat8_1/bin/bootstrap.jar:/application/tomcat8_1/bin/tomcat-juli.jar -Dcatalina.base=/application/tomcat8_1 -Dcatalina.home=/application/tomcat8_1 -Djava.io.tmpdir=/application/tomcat8_1/temp org.apache.catalina.startup.Bootstrap start
root       6018   1878  0 12:27 pts/1    00:00:00 su - tomcat
tomcat     6019   6018  0 12:27 pts/1    00:00:00 -bash
tomcat     6089   6019  0 12:28 pts/1    00:00:00 ps -ef
tomcat     6090   6019  0 12:28 pts/1    00:00:00 grep --color=auto tomcat
[tomcat@LJS ~]

第二种用法:

[root@LJS webapps]# su - tomcat -c '/home/tomcat/tomcat8_2/bin/shutdown.sh'
 [root@LJS webapps]# su - tomcat -c '/home/tomcat/tomcat8_2/bin/startup.sh'
[root@LJS webapps]# ps -ef | grep tomcat 
root       2715   1513  0 09:27 pts/0    00:00:00 tailf /application/tomcat/logs/catalina.out
tomcat     9117      1 99 15:19 ?        00:00:03 /application/jdk/bin/java -Djava.util.logging.config.file=/home/tomcat/tomcat8_2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/home/tomcat/tomcat8_2/endorsed -classpath /home/tomcat/tomcat8_2/bin/bootstrap.jar:/home/tomcat/tomcat8_2/bin/tomcat-juli.jar -Dcatalina.base=/home/tomcat/tomcat8_2 -Dcatalina.home=/home/tomcat/tomcat8_2 -Djava.io.tmpdir=/home/tomcat/tomcat8_2/temp org.apache.catalina.startup.Bootstrap start
root       9143   1878  0 15:19 pts/1    00:00:00 grep --color=auto tomcat
[root@LJS webapps]#

telnet管理端口保护
ajp连接端口保护
禁用管理端

[root@LJS tomcat]# cd webapps/
[root@LJS webapps]# pwd
/application/tomcat/webapps
[root@LJS webapps]#  mv * /tmp/
[root@LJS webapps]# ls
[root@LJS webapps]# mkdir ROOT
[root@LJS webapps]# ls
ROOT
[root@LJS webapps]#

1.11.2 性能优化

屏蔽dns查询enableLookups="false"
        <Connector  port="8081" protocol="HTTP/1.1"
                             connectionTimeout="6000" enableLookups="false" acceptCount="800"
                             redirectPort="8443" />

jvm调优
Tomcat最吃内存,只要内存足够,这只猫就跑的很快。
如果系统资源有限,那就需要进行调优,提高资源使用率。
优化catalina.sh配置文件。在catalina.sh配置文件中添加以下代码:
vim /application/tomcat8_1/bin/catalina.sh +97
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms2048m -Xmx2048m -XX
:NewSize=1024m -XX:MaxNewSize=1024m"
说明:
server:一定要作为第一个参数,在多个CPU时性能佳
-Xms:初始堆内存Heap大小,使用的最小内存,cpu性能高时此值应设的大一些
-Xmx:初始堆内存heap最大值,使用的最大内存
上面两个值是分配JVM的最小和最大内存,取决于硬件物理内存的大小,建议均设为物理内存的一半。
-XX:PermSize:设定内存的永久保存区域
-XX:MaxPermSize:设定最大内存的永久保存区域
-XX:MaxNewSize:
-Xss 15120 这使得JBoss每增加一个线程(thread)就会立即消耗15M内存,而最佳值应该是128K,默认值好像是512k.
+XX:AggressiveHeap 会使得 Xms没有意义。这个参数让jvm忽略Xmx参数,疯狂地吃完一个G物理内存,再吃尽一个G的swap。
-Xss:每个线程的Stack大小
-verbose:gc 现实垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一
-XX:+UseParNewGC :缩短minor收集的时间
-XX:+UseConcMarkSweepGC :缩短major收集的时间