第19章 tomcat的搭建

19.1 tomcat学习之前的预备知识

19.1.1 什么是JVM和JDK,JRE

  • JVM            java虚拟机,实现一份代码可以在不同的平台执行,具有可移植性,jvm只关注java虚拟机的情况
  • JDK                java开发环境
  • JRE                java运行环境

19.2 tomcat的服务部署

19.2.1 tomcat服务的配置

[root@web01 webapps] # cd /server/tools/

[root@web01 tools] # tar xf apache-tomcat-8.0.27.tar.gz -C /application

[root@web01 application] # ln -s /application/apache-tomcat-8.0.27/ /application/tomcat

[root@web01 application] # cd /server/tools/

[root@web01 tools] # tar xf jdk-8u60-linux-x64.tar.gz -C /application/

[root@web01 application] # ln -s jdk1.8.0_60/ /application/jdk

cat >>/etc/profile<<'EOF'

export JAVA_HOME=/application/jdk

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

export

CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOM

E/lib/tools.jar

export TOMCAT_HOME=/application/tomcat

EOF

19.2.2 tomcat版本的选择

[root@web01 ipv4] # 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)

You have new mail in /var/spool/mail/root

[root@web01 ipv4] #

19.2.3 jvm版本的选择

[root@web01 ipv4] # /application/tomcat/bin/version.sh            查看tomcat和jdk的版本是不是一致的

Server number: 8.0.27.0

OS Name: Linux

OS Version: 3.10.0-1062.1.1.el7.x86_64

Architecture: amd64

JVM Version: 1.8.0_60-b27

19.3 tomcat服务的启动

19.3.1 启动命令

[root@web01 ipv4] # /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.

You have new mail in /var/spool/mail/root

[root@web01 ipv4] #

[root@web01 tomcat] # ps -ef | grep java

root 12462 1 96 19:50 pts/2 00:00:02 /application/jdk/bin/java -Djava.util.logging.config.file=/application/tomcat/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.7 -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 12480 8056 0 19:50 pts/2 00:00:00 grep --color=auto java

[root@web01 tomcat] # ss -lnptu | grep java

tcp LISTEN 0 100 :::8009 :::*

tcp LISTEN 0 100 :::8080 :::* users:(("java",pid=12462,fd=50))

[root@web01 tomcat] #

19.3.2 关闭命令

[root@web01 ipv4] # /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@web01 ipv4] #

[root@web01 tomcat] # ps -ef | grep java

root 12451 8056 0 19:50 pts/2 00:00:00 grep --color=auto java

[root@web01 tomcat] # ss -lnptu | grep java

[root@web01 tomcat] #

19.3.3 核心命令

[root@web01 ipv4] # /application/tomcat/bin/catalina.sh                表示tomcat启动还是关闭都会调用这个命令

19.4 tomcat的目录介绍

19.4.1 conf目录介绍

19.4.1.1 server.xml

主配置文件

22 <Server port="8005" shutdown="SHUTDOWN">            tomcat的shutdown端口,连接tomcat的时                                                候,连接这个端口,并且输入暗号tomcat就会断开

41 <Resource name="UserDatabase" auth="Container"        用户管理端,认证模式,用户密码模式(这个默认是开启的,在生产环境上一定要关闭)

42 type="org.apache.catalina.UserDatabase"

43 description="User database that can be updated and saved"

44 factory="org.apache.catalina.users.MemoryUserDatabaseFactory"

45 pathname="conf/tomcat-users.xml" />

46 </GlobalNamingResources>

69 <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"        表示tomcat的web管理端口(登录web的时候使用的就是这个端口)

94 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />            apache和tomcat连接的时候预留的端口(如果不是tomcat建议将这行注释掉)

126 <Host name="localhost" appBase="webapps"            定义tomcat的域名和站点目录

127 unpackWARs="true" autoDeploy="true">    定义上传到站点目录的war包是不是自动解压

138 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs

"

139 prefix="localhost_access_log" suffix=".txt"            访问日志的前缀和后缀

140 pattern="%h %l %u %t &quot;%r&quot; %s %b" />

19.4.1.2 tomcat-users.xml

tomcat管理配置文件

19.4.1.3 web.xml

tomcat的额外功能

19.4.2 bin目录介绍

19.4.2.1 shutdown.sh

关闭tomcat程序

19.4.2.2 startup.sh

开启tomcat程序

19.4.2.3 Catalina.sh

  • tomcat的核心脚本,shutdown.sh和startup.sh都会调用这个核心脚本.
  • java远程管理配置
  • 配置jvm的参数信息

19.4.2.4 version.sh

查看tomcat和jdk的版本是不是可以兼容

19.4.3 webapps目录介绍

java程序的站点目录

  • 注意:java站点目录想要获取首页文件,不能讲信息放入到webapps下面就可以访问,需要在加入你下面的具体目录,默认是ROOT

19.4.3.1 db.protifies(记录和数据库进行连接的一些信息)

[root@web01 bin] # cd /application/tomcat/webapps/jpress/WEB-INF/classes/

You have new mail in /var/spool/mail/root

[root@web01 classes] # ll

total 36

-rw-r--r-- 1 root root 163 Dec 17 09:42 db.properties

19.4.4 logs目录介绍

19.4.4.1 catalina.2019-12-17.log

Catalina的日志切割

19.4.4.2 catalina.out

记录tomcat最详细的信息(查看error和start)

  • 注意,日志切割以后是不会自己清零,重新记录的,需要自己手动清空里面的日志
19.4.4.2.1 为什么日志不可以删除,需要清空数据来处理了

因为对于日志文件来说,完全删除一个文件是要具备2个条件的

  1. 日志必须的硬链接数为0
  2. 关联的日志进程数为0(lsof| grep delete),如果关联进程数为0,就算你删除文件,由于他还是指向的日志的inode,所以日志不会释放空间

19.4.4.3 access_log.2019-12-16.txt

tomcat的访问日志

19.5 tomcat的管理端的配置

19.5.1 注意事项

  • tomcat管理端的配置在测试和调试阶段可以打开进行使用
  • tomcat管理端在正式环境关闭(以免黑客的攻击)

19.5.2 配置的路径

19.5.2.1 配置路径并且将信息填写好

[root@web01 ~] # cd /application/tomcat/conf/

[root@web01 conf] # vim tomcat-users.xml

<?xml version='1.0' encoding='utf-8'?>

<tomcat-users xmlns="http://tomcat.apache.org/xml"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"

version="1.0">

<role rolename="admin-gui"/>                配置server status

<role rolename="manager-gui"/>            配置Manage app

<role rolename="host-gui"/>                配置HostManage

<user username="tomcat" password="tomcat" roles="admin-gui,manager-gui,host-gui"/>

</tomcat-users>

[root@web01 conf] #

19.5.2.2 tomcat服务关闭并且启动

[root@web01 conf] # /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

You have new mail in /var/spool/mail/root

[root@web01 conf] # /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@web01 conf] #

19.5.2.3 web网站查看结果

19.6 tomcat的部署及应用方式

19.6.1 tomcat安装成功

采用编译的方法安装,这里就不详细说了

19.6.2 上传网站代码(jpress)

将jpress代码安装包放入到webapps目录下

19.6.3 配置数据库信息

19.6.3.1 安装mariadb数据库

[root@db ~] # yum -y install mariadb-server mariadb

19.6.3.2 创建tomcat所使用的数据库

MariaDB [(none)]> create database jpress charset utf8;

19.6.3.3 查看创建的数据库信息

MariaDB [(none)]> show create database jpress;

+----------+-----------------------------------------------------------------+

| Database | Create Database |

+----------+-----------------------------------------------------------------+

| jpress | CREATE DATABASE `jpress` /*!40100 DEFAULT CHARACTER SET utf8 */ |

+----------+-----------------------------------------------------------------+

1 row in set (0.01 sec)

19.6.3.4 创建jpress用户

MariaDB [(none)]> grant all on jpress.* to 'jpress'@'172.16.1.%' identified by 'jpress';

19.6.3.5 启动maridab数据库

[root@db ~] # systemctl restart mariadb.service

19.6.4 启动tomcat

[root@web01 conf] # /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.

You have new mail in /var/spool/mail/root

[root@web01 conf] #

19.6.5 web网站登录

19.6.6 实现tomcat二进制安装开机自启

[root@web01 webapps] # vim /etc/rc.local

source /etc/profile

/application/tomcat/bin/startup.sh

19.7 tomcat常见的3种工作模式介绍

19.7.1 tomcat的3种模式比较

模式

应用版本

核心点

特点

bio(blocking io)

tomcat7及以前的

同步模式,容易阻塞

一个线程处理一个请求,在并发量高的时候,容易造成线程数多,导致资源的浪费

nio(new io)

tomcat8

异步模式,不容易阻塞

nio1(默认使用),nio2可以少量线程处理大量请求

apr(Apache

Portable

Runtime)

tomcat8

异步模式的

高并发的情况下使用

19.7.2 配置不同的工作模式

69 <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"

69 <Connector port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol"

69 <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"

19.8 tomcat多实例介绍

19.8.1 什么是tomcat多实例,为什么要创建tomcat多实例

  • 可以在1台服务器上面可以运行多个tomcat

19.8.2 创建多实例的时候要注意的事项

  • 端口不同
  • 路径不同

19.8.3 多实例的创建

19.8.3.1 解压tomcat包,并且移到/application目录下,并且创建软连接

[root@web01 tools]# tar xf apache-tomcat-8.0.27.tar.gz                解压tomcat包

[root@web01 tools]# cp -r apache-tomcat-8.0.27 tomcat8081             讲解压的包进行复制,并且修改名称

[root@web01 tools]# cp -r apache-tomcat-8.0.27 tomcat8082            将解压的包进行复制,并且修改名称

[root@web01 tools]# mv tomcat808* /application/                    移动到/application目录下

[root@web01 tools]# ll /application/

drwxr-xr-x 9 root root 160 Dec 16 12:01 apache-tomcat-8.0.27

lrwxrwxrwx 1 root root  25 Dec 16 11:52 jdk ->/application/jdk1.8.0_60/

drwxr-xr-x 8  10  143 255 Aug  5  2015 jdk1.8.0_60

drwxr-xr-x 6 root root  54 Nov  5 19:03 nginx-1.16.1

lrwxrwxrwx 1 root root  34 Dec 16 12:01 tomcat ->/application/apache-tomcat-8.0.27/

drwxr-xr-x 9 root root 160 Dec 17 11:10 tomcat8081

drwxr-xr-x 9 root root 160 Dec 17 11:10 tomcat8082

[root@web01 application]# sed -i 's#8080#8081#g'            tomcat8081的网站web端口改为8081

tomcat8081/conf/server.xml

[root@web01 application]# sed -i 's#8005#8006#g'            将关闭tomcat进程端口8005改为8006

tomcat8081/conf/server.xml

[root@web01 application]# sed -i 's#8009#8010#g'            将apache和tomcat连接的端口8009改为8010

tomcat8081/conf/server.xml

[root@web01 application]#

[root@web01 application]#

[root@web01 application]# sed -i 's#8080#8082#g'            tomcat8080的网站web端口改为8082

tomcat8082/conf/server.xml

[root@web01 application]# sed -i 's#8005#8007#g'            将关闭tomcat进程端口8005改为8007

tomcat8082/conf/server.xml

[root@web01 application]# sed -i 's#8009#8011#g'            将apache和tomcat连接的端口8009改为8011

tomcat8082/conf/server.xml

19.8.3.2 启动tomcat8081和tomcat8082服务

[root@web01 ~] # /application/tomcat8081/bin/startup.sh             启动8081tomcat服务

Using CATALINA_BASE: /application/tomcat8081

Using CATALINA_HOME: /application/tomcat8081

Using CATALINA_TMPDIR: /application/tomcat8081/temp

Using JRE_HOME: /application/jdk

Using CLASSPATH: /application/tomcat8081/bin/bootstrap.jar:/application/tomcat8081/bin/tomcat-juli.jar

Tomcat started.

You have new mail in /var/spool/mail/root

[root@web01 ~] # /application/tomcat8082/bin/startup.sh             启动8082tomcat服务

Using CATALINA_BASE: /application/tomcat8082

Using CATALINA_HOME: /application/tomcat8082

Using CATALINA_TMPDIR: /application/tomcat8082/temp

Using JRE_HOME: /application/jdk

Using CLASSPATH: /application/tomcat8082/bin/bootstrap.jar:/application/tomcat8082/bin/tomcat-juli.jar

Tomcat started.

[root@web01 ~] #

19.8.3.3 查看tomcat启动的端口和进程信息

[root@web01 ~] # ss -lnptu | grep java

tcp LISTEN 0 50 :::12345 :::* users:(("java",pid=11734,fd=20))

tcp LISTEN 0 1 ::ffff:127.0.0.1:8005 :::* users:(("java",pid=11734,fd=68))

tcp LISTEN 0 1 ::ffff:127.0.0.1:8006 :::* users:(("java",pid=11653,fd=64))

tcp LISTEN 0 1 ::ffff:127.0.0.1:8007 :::* users:(("java",pid=11675,fd=64))

tcp LISTEN 0 100 :::8009 :::* users:(("java",pid=11734,fd=51))

tcp LISTEN 0 100 :::8010 :::* users:(("java",pid=11653,fd=47))

tcp LISTEN 0 100 :::8011 :::* users:(("java",pid=11675,fd=47))

tcp LISTEN 0 100 :::8080 :::* users:(("java",pid=11734,fd=50))

tcp LISTEN 0 100 :::8081 :::* users:(("java",pid=11653,fd=46))

tcp LISTEN 0 100 :::8082 :::* users:(("java",pid=11675,fd=46))

tcp LISTEN 0 50 :::34294 :::* users:(("java",pid=11734,fd=21))

tcp LISTEN 0 50 :::39958 :::* users:(("java",pid=11734,fd=19))

[root@web01 ~] # ps -ef | grep java

root 11653 1 3 19:51 pts/0 00:00:04 /application/jdk/bin/java -Djava.util.logging.config.file=/application/tomcat8081/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat8081/endorsed -classpath /application/tomcat8081/bin/bootstrap.jar:/application/tomcat8081/bin/tomcat-juli.jar -Dcatalina.base=/application/tomcat8081 -Dcatalina.home=/application/tomcat8081 -Djava.io.tmpdir=/application/tomcat8081/temp org.apache.catalina.startup.Bootstrap start

root 11675 1 3 19:51 pts/0 00:00:04 /application/jdk/bin/java -Djava.util.logging.config.file=/application/tomcat8082/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat8082/endorsed -classpath /application/tomcat8082/bin/bootstrap.jar:/application/tomcat8082/bin/tomcat-juli.jar -Dcatalina.base=/application/tomcat8082 -Dcatalina.home=/application/tomcat8082 -Djava.io.tmpdir=/application/tomcat8082/temp org.apache.catalina.startup.Bootstrap start

root 11734 1 15 19:52 pts/0 00:00:03 /application/jdk/bin/java -Djava.util.logging.config.file=/application/tomcat/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.7 -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 11785 11497 0 19:53 pts/0 00:00:00 grep --color=auto java

[root@web01 ~] #

19.8.3.4 登陆web界面

19.9 tomcat监控功能介绍

19.9.1 通过监控软件可以监控tomcat状态

主要是查看jvm的状态(jvm里面主要是关注内存的使用率信息)

19.9.2 常见的监控方法有哪些

  • 通过命令或者脚本查看
  • 开启tomcat监控功能,再让zabbix监控

19.9.2.1 命令的方法来查看进程程度

19.9.2.1.1 java的一个查看java信息的命令

[root@web01 ROOT] # jps -lmv

11653 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat8081/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat8081/endorsed -Dcatalina.base=/application/tomcat8081 -Dcatalina.home=/application/tomcat8081 -Djava.io.tmpdir=/application/tomcat8081/temp

19.9.2.1.2 使用脚本来查看线程的繁忙程度
  • 使用pstree可以查看所有的进程和线程的PID值
  1. pstree -H PID值:指定查找特定PID的线程信息(不能和-np一起使用)
  2. pstree -np:查找所有的进程和线程信息,并且显示pid值(p)

[root@web01 scripts] # ./show-busy-java-threads.sh

[1] Busy(73.0%)
thread(2543/0x9ef) stack of java process(2542) under user(root):

"main" #1 prio=5 os_prio=0 tid=0x00007f4788009000 nid=0x9ef waiting on condition [0x00007f478e5db000]

java.lang.Thread.State: WAITING (parking)

at sun.misc.Unsafe.park(Native Method)

  • Busy                指的是线程的繁忙程度(默认脚本列出来的第一个就是最繁忙)
  • thread(2543/0x9ef))    指的是线程的PID值/16进制的PID值
  • process                指的是线程所属的进程PID值
  • 进程和线程的区别
  1. 进程简要说是在内存中创建空间
  2. 线程简要说就是真正处理用户请求的信息
  3. 线程是进程内的一个执行单位,一个进程里面至少一个线程,他们共享进程的地址空间,但是进程与进程之间独立的
  4. 资源的调度:进程是分配资源和拥有资源的地方,线程共享进程资源
  5. 二者均可并发执行
  6. 线程是处理器的基本单位,但是进程不是
  7. 每个线程都有一个独立的程序运行的接口

19.9.2.2 软件开启tomcat监控功能

19.9.2.2.1 配置tomcat监控

vim /application/tomcat/bin/catalina.sh

97 CATALINA_OPTS="$CATALINA_OPTS                 java内置变量,修改java启动参数

98 -Dcom.sun.management.jmxremote                         开启tomcat远程监控监控功能

99 -Dcom.sun.management.jmxremote.port=12345                监控的端口信息

100 -Dcom.sun.management.jmxremote.authenticate=false        远程监控的认证信息

101 -Dcom.sun.management.jmxremote.ssl=false                 https功能是否开启

102 -Djava.rmi.server.hostname=10.0.0.7"                    远程监听的主机IP地址

97 CATALINA_OPTS="$CATALINA_OPTS

98 -Dcom.sun.management.jmxremote

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

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

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

102 -Djava.rmi.server.hostname=10.0.0.7"

扩展:java内置变量去哪查看(-D后面接的就是java内置变量)

[root@web01 bin] # ps -ef | grep java

root 2542 1 0 08:00 pts/0 00:00:11 /application/jdk/bin/java -Djava.util.logging.config.file=/application/tomcat/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.7

-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 7534 2379 0 09:15 pts/0 00:00:00 grep --color=auto java

19.9.2.2.2 软件连接tomcat进行监控查看
  • 在windows下安装jdk软件(注意不要改安装目录,要不会有问题)

  • 通过windows jconsole 连接(模拟zabbix连接) linux tomcat(输入C:\Program Files\Java\jdk1.8.0_31\bin找见jconsole.exe)

  • 打开软件开始监测

19.10 tomcat与nginx

19.10.1 tomcat(LNMT)

  • tomcat可以处理静态和动态的资源
  • tomcat处理静态资源能力比较弱
  • nginx处理静态资源,遇到动态资源在nginx发送给tomcat即可

19.10.2 搭建LNMT

19.10.2.1 方法一(模仿LNMP来搭建LNMT)

[root@web01 jpress]# cat /etc/nginx/conf.d/tomcat.conf

server {

listen 80;

server_name java.oldboy.com;

client_max_body_size 10m;

root /application/tomcat/webapps;

location / {

index index.jsp index.html index.htm;

}

location ~ \.jsp$ {

proxy_pass 127.0.0.1:8080;

}

}

19.10.2.2 方法二(nginx反向代理 + tomcat)

upstream tomcat {

server 10.0.0.7:8080;

server 10.0.0.7:8081;

server 10.0.0.8:8080;

}

server   {

listen 80;

server_name tomcat.oldboy.com;

location / {

proxy_pass http://tomcat ;

}

}

19.10.2 搭建LNMP

  • nginx处理静态资源
  • 动态资源nginx遇到在发送给php进行处理

19.11 tomcat的故障排查

19.11.1 解决tomcat服务器占用大量swap空间的问题

因为tomcat占用的是本身的swap空间,不会占用系统内存,针对这个情况,做如下解决

19.11.1.1 修改系统内核参数来解决

19.11.1.1.1 查找内核路径

内核对应的目录在:/proc/sys/目录下

内核对应的文件在: /proc/sys/vm/swappiness

  • 修改系统内核(修改系统内核去/etc/sysctl.conf)

[root@web01 sys] # vim /etc/sysctl.conf

# sysctl settings are defined through files in

vm.swappiness =0                        修改为0,不使用swap空间,优先使用物理内存

19.1.1.1.1.2 让内核重新加载生效

[root@web01 sys] # sysctl -p

vm.swappiness = 0

[root@web01 sys] #

19.11.2 tomcat负载比较高

19.11.2.1 查看负载比较高的命令

vmstat/top/ps aux

  • r    表示r越大,说明内存的使用越高
  • b    表示b越大,说明磁盘的IO使用较高

19.11.2.2 查看发现内存的使用率比较高,再次使用top查看

19.11.2.3 查看tomcat(java)的进程ID,并且使用命令查看详细的进程信息,找出来哪个线程造成的问题

H        显示进程下面的详细线程信息

p        指定单独的进程信息

19.11.2.4 (jstack)将线程占有率高的ID值转换成16进制,并且通过命令jstack查看问题信息

[root@web01 sys] # echo 'obase=16;2544'| bc

9F0

[root@web01 sys] #

将上面的信息查出来发给研发分析问题原因

19.11.2.5 (jmap -heap)显示jvm的内存信息

19.11.2.6 (jmap -dump)将内存数据导出来

[root@web01 sys] # jmap -dump:format=b,file=/tmp/aa.bin 2542

Dumping heap to /tmp/aa.bin ...

Heap dump file created

[root@web01 sys] #

19.11.3 总结下tomcat负载高的配错思路

  • 使用命令查看是哪个进程的问题(top/ps/vmstat)
  • 使用top -Hp 进程PID值来分析具体是进程中的哪个线程问题
  • 将不正常的线程PID值转换成16进制数
  • 使用jstack -l 进程PID值 | grep -iC 5 线程的16进制数,查找出问题交给研发进行处理,在这个情况下基本可以处理成功,如果不行,使用如下命令
  • jmap -heap 进程PID值,可以显示jvm的内存信息
  • 在使用jmap -dump命令导出来,并且将数据导入到windows电脑上进行分析
  • 分析工具使用MAT(Memory Analyzer Tool)来进行分析

19.12 tomcat优化

19.12.1 安全优化

19.12.1.1 telenet管理端口和暗号进行修改

[root@web01 sys] # cd /application/tomcat/conf/

[root@web01 conf] # vim server.xml

22 <Server port="8005" shutdown="SHUTDOWN">        这行进行修改

19.12.1.2 ajp端口进行保护

94 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />    apache和tomcat连接的端口

注意:如果你使用的不是apache,建议将他给关闭

19.12.1.3 将管理端给删除

  1. 删除默认的tomcat/conf/tomcat-users.xml文件,重启tomcat后将会自动生成新的文件
  2. 删除tomcat /webapps下默认的所有目录和文件(除了自己上传的代码(jpress和ROOT),剩下的都可以))
  3. 将tomcat 应用根目录配置为tomcat安装目录以外的目录;

19.12.1.4 降权启动服务(keep in jail)

让普通用户的权限来进行运行服务

19.12.1.5 文件列表访问功能关闭(如果不懂可以理解为nginx服务的网络共享一样(autoindex on;))

[root@web01 conf] # cat /application/tomcat/conf/web.xml

<init-param>

<param-name>listings</param-name>

<param-value>false</param-value>            默认false,如果是比较老的版本是开启的

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

19.12.1.6 版本信息的隐藏

  • 在访问tomcat失败的时候会出现版本信息的暴露,针对这个情况我们做些java代码的优雅显示

[root@web01 conf] # cat /application/tomcat/conf/web.xml

<error-page>

<error-code>403</error-code>

<location>/forbidden.jsp</location>

</error-page>

<error-page>

<error-code>404</error-code>

<location>/notfound.jsp</location>

</error-page>

<error-page>

<error-code>500</error-code>

<location>/systembusy.jsp</location>

</error-page>

19.12.1.7 修改访问软件的服务名称

  • 实现tomcat访问网站但是里面显示的是nginx服务

[root@web01 conf] # vim /application/tomcat/conf/server.xml

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"

server="nginx-1.16.1"                修改为nginx-1.16.1

maxThreads="500"

minSpareThreads="10"

connectionTimeout="20000"

redirectPort="8443" />

<!-- A "Connector" using the shared thread pool-->

19.12.1.8 设置后台访问权限(allow,deny)

<Context path="" docBase="/home/work/tomcat" debug="0"

reloadable="false" crossContext="true">

<Valve className="org.apache.catalina.valves.RemoteAddrValve"

allow="61.148.18.138,61.135.165.*" deny="*.*.*.*"/>

19.12.1.9 tomcat启动停止脚本权限更改

将权限更改为700,默认755,8.5版本以后就默认是700

19.12.1.10 访问日志的规范

[root@web01 conf] # vim /application/tomcat/conf/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 %{Referer}i %{User-Agent}i %D" resolveHosts="false"/>

  • {Referer}I            定义从哪个网站跳转过来的
  • {User-Agent}            定义客户端访问tomcat所使用的的终端信息

19.12.2 性能优化

19.12.2.1 设置并发线程的最大数量

  • maxThreads="500"                最大的线程数量,一般200-400之间
  • minSpareThreads="10"            空闲时候最小的线程数量

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"

70 server="nginx-1.16.1"

71 connectionTimeout="20000"

72 redirectPort="8443" />

19.12.2.2 打开java压力测试工具

路径:    C:\Users\liangyuxing\Desktop\apache-jmeter-5.2.1\bin\jmeter.bat

19.12.2.2.1 修改语言信息

19.12.2.2.2 添加线程组

19.12.2.2.3 开始测试
  • 查看结果树和聚合报告相当于创建了监控,你在测试的过程中,这里可以看见数据

19.12.2.3 将线程进行修改为最大500,最小10

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"

70 server="nginx-1.16.1"

71 maxThreads="500"                设置线程的最大线程数量

72 minSpareThreads="10"            空闲时候最小的线程数量

73 connectionTimeout="20000"

74 redirectPort="8443" />

tomcat的搭建和介绍的更多相关文章

  1. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)

    前言     上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库 ...

  2. Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)

    上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库文件和版本,以 ...

  3. ECLIPSE JSP TOMCAT 环境搭建

    ECLIPSE JSP TOMCAT 环境搭建(完整) 要学习一门语言,首先要做的就是搭建环境,然后能写一个小的Demo(类似Helloworld),不仅可以建立信心,而且还可以为之后的学习搭建一个验 ...

  4. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境

    前言 但凡一个略有规模的项目都需要一个持续集成环境的支撑,为什么需要持续集成环境,我们来看一个例子.假如一个项目,由A.B两位程序员来协作开发,A负责前端模块,B负责后端模块,前端依赖后端.A和B都习 ...

  5. Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境

    使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一) 2015-01-14 20:28 by 飘扬的红领巾, 4322 阅读, 5 评论, 收藏, 编辑 ...

  6. 阿里云服务器之Tomcat环境搭建以及域名绑定

    上一步主要主要讲解在服务器中建立自己的hexo博客环境,最后达到可以远程访问,以及远程git推送到github.这章主要讲解Tomcat环境的搭建,以及域名解析.到这里你的服务器以及可以被全世界的人民 ...

  7. JDK环境变量配置贺Tomcat环境搭建

    一.安装JDK JDK (Java Develpmet kit) Java开发环境(工具包和运行环境jre) 是Java开发的核心,包括:编译程序的命令 javac 运行程序java命令 he jav ...

  8. nginx+tomcat+memcached搭建服务器集群及负载均衡

    在实际项目中,由于用户的访问量很大的原因,往往需要同时开启多个服务器才能满足实际需求.但是同时开启多个服务又该怎么管理他们呢?怎样实现session共享呢?下面就来讲一讲如何使用tomcat+ngin ...

  9. vultr VPS的购买及搭建ss介绍,支持锐速加速优化

    Vultr虽然成立时间不久,但是其背景实力还是比较雄厚的,基于全球最大的游戏服务器提供商之一的基础,所以才有实力开设这么多的数据中心.有速度较好的日本东京.洛杉矶等机房,也有我们很多人需要的欧洲机房等 ...

随机推荐

  1. VSCode编写vue项目文件出现红色波浪线

    VSCode编写vue项目文件出现红色波浪线 在我们在写Vue或其他项目时,可能会遇到这样一个问题:明明自己的代码程序都没有错,代码规范也符合标准,为什么它就是给我报错显红呢??? 解决方案 第一种方 ...

  2. 关于“TypeError: Assignment to constant variable”的问题解决方案

    在项目开发过程中,在使用变量声明时,如果不注意,可能会造成类型错误比如: Uncaught (in promise) TypeError: Assignment to constant variabl ...

  3. 输入URL回车之后,究竟发生了什么

    https://blog.csdn.net/androidstarjack/article/details/107031771 在浏览器输入URL回车之后发生了什么?(超详细版)   前言 这个问题已 ...

  4. 202A 202B 202C 202D 202E字符的作用及解释

    这里你会发现在值的前后有2个\u开头的控制字符:转换网址:http://www.jsons.cn/utf8/ 解释:https://blog.csdn.net/haiyan1111/article/d ...

  5. jvm-learning-类加载器分类

    public class ClassLoaderTest { public static void main(String[] args) { //获取系统类加载器 ClassLoader syste ...

  6. springboot 定时任务 session报错问题

    一.自定义类 LocalVariable package com.lh.mes.base.thread; import java.util.Optional; public class LocalVa ...

  7. 什么是 CSRF 攻击?

    CSRF 代表跨站请求伪造.这是一种攻击,迫使最终用户在当前通过身份验证的 Web 应用程序上执行不需要的操作.CSRF 攻击专门针对状态改变请求,而不是 数据窃取,因为攻击者无法查看对伪造请求的响应 ...

  8. 哪一个List实现了最快插入?

    LinkedList和ArrayList是另个不同变量列表的实现.ArrayList的优势在于动态的增长数组,非常适合初始时总长度未知的情况下使用.LinkedList的优势在于在中间位置插入和删除操 ...

  9. Numpy怎样将数组读写到文件

    Numpy怎样将数组读写到文件 本文档介绍的是Numpy以自己内建二进制的方式,将数组写出到文件,以及从文件加载数组: 如果是文本.表格类数据,一般使用pandas这个类库做加载和处理,不用numpy ...

  10. [C/C++基础知识] main函数的参数argc和argv

    该篇文章主要是关于C++\C语言最基础的main函数的参数知识,是学习C++或C语言都必备的知识点.不知道你是否知道该知识?希望对大家有所帮助.一.main()函数参数通常我们在写主函数时都是void ...