快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

tomcat总结

java与tomcat搭配,tomcat用来运行java程序
目前Tomcat最新版本为9.0
Tomcat处理静态HTML的能力不如Nginx/Apache服务器
Java容器还有resin、weblogic等
Tomcat服务器是一个免费的开放源代码的Web应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP网页的首选
Tomcat官网:http://tomcat.apache.org/

常规JAVA应用架构模型:
首先,我们之前搭建的网站,php的,前面有个nginx反向代理,就是lb01,后面有我们的web服务器,web服务器上是nginx加php,数据库被我们丢到后面了,这就是一个经典的套路,但是到了tomcat java程序中,稍微有那么点变化,也就是tomecat他自己就是一个服务器,他又可以处理java这种动态的请求,他的应该是这样的,前面一个nginx反向代理,这肯定要加的,后面加上tomcat,然后让他连接数据库,但是注意,tomcat这个只要是处理java程序的或者jsp这些页面的,所以对于一些静态的请求,还不是太擅长处理,效率不高,所以对于tomcat这种java程序的网站,一定要做好动静分离,动态的给tomcat处理,静态的就交给nginx自己搞定就行了,最好一定要做上动静分离,静态页面放一起,动态交给tomcat,如果这里你发现了,顶替之前php地位的叫JVM,其实是tomcat里面,这个核心
一起来看看什么是JVM(java虚拟机),他完成了什么事情?这个虚拟机可以在任何系统里运行,只要有java虚拟机的环境准备好了,就可以运行这个这个java的程序

滨海ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!

jdk:java develpement kit,是java所运行的环境工具,也是JVM tomcat运行所必要的环境
Oracle JDK:商业软件 官方的
openjdk:开源软件 在linux下yum安装就是openjdk

===================================
环境准备及软件选择
从CentOS7模板机全新克隆2台新主机
第1台:IP规划为10.0.0.17/172.16.1.9,主机名为web03
第2台:IP规划为10.0.0.18/172.16.1.10,主机名为web04
准备好lb01(CentOS6),需要其上的nginx反向代理功能
下载相关软件包:http://pan.baidu.com/s/1IpioA
注:jdk和Tomcat的版本对运维来说没什么区别,安装方法高度一致。

===================================
######部署jdk
打开web03服务器
mkdir -p /server/tools/
cd /server/tools/
#tomcat包和jdk包上传到linux 上传jdk-8u60-linux-x64.tar.gz apache-tomcat-8.0.27.tar.gz
#tomcat是apache这个基金会中的一个项目,一个软件,web服务叫httpd,apache是一个整体的项目,好多软件的
rz
ll -h
mkdir -p /application/
#-C解压到指定目录
tar xf jdk-8u60-linux-x64.tar.gz -C /application/
ls -l /application/
#一定要创建软链接,否则下面的步骤就错了
ln -s /application/jdk1.8.0_60/ /application/jdk
#配置java相关的一些环境变量,java中,环境变量就多一点了,把他们配置到/etc/profile中,注意EOF两边要加单引号,不加的话会$环境变量直接解析,我们这里是不需要解析的
cat >>/etc/profile<<'EOF'
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
EOF

或者
sed -i.ori '$a export JAVA_HOME=/application/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile

#让它生效
source /etc/profile
#验证jdk是否配置成功
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)

========================================================
########部署tomcat jdk 与tomcat会有版本兼容问题这个注意一下,tomcat不像php,也不像nginx需要编译,tomcat解压你就可以用,准备好jdk环境,解压你就能用
tar xf apache-tomcat-8.0.27.tar.gz -C /application/
ln -s /application/apache-tomcat-8.0.27/ /application/tomcat
#配置tomcat的老家 TOMCAT_HOME
echo 'export TOMCAT_HOME=/application/tomcat'>>/etc/profile
source /etc/profile
#还有个问题,我们解压出来的这些软件,有一些是从网上下载的压缩包,解压出来,正常应该是属于我们root用户,但是有的时候会变成这样,变成数字,例如这里变成10,这说明这个文件对应的用户,比如说这是uid 10,对应的用户不存在,这样会导致有的时候会有权限问题,所以最终还是改一下所有者
ll /application/jdk/ /application/tomcat/
chown -R root.root /application/jdk/ /application/tomcat/
ll /application/jdk/ /application/tomcat/
#查看tomcat 版本信息及其他信息,显示出了tomcat的版本8.0.27,还有系统的配置,JVM的版本,也就是JDK的版本,这表示你的JDK和tomcat部署成功
/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: 2.6.32-696.el6.x86_64
Architecture: amd64
JVM Version: 1.8.0_60-b27
JVM Vendor: Oracle Corporation

#有时候tomcat启动关闭慢,可以安装rngd服务(熵服务,增大熵池),提升速度
yum install rng-tools -y

#启动服务
systemctl start rngd
systemctl enable rngd

#启动关闭tomcat@@@@@@@@@@@@@@@@@@@@@@@@@@@@
br/>@@@@@@@@@@@@@@@@@@@@@@@@@@@@

/application/tomcat/logs/catalina.out
tail -f /application/tomcat/logs/catalina.out@@@@@@@@@@@@@@@@@@@@@@@@@@@@
br/>@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#注意ss -lntup查看的是端口,不是查grep tomcat ,ss -lntup|grep tomcat语句是废的,查不出结果的
#ps -ef|grep tomcat 能查到tomcat进程,一般我们不查,只查java就可以
#它默认用的接口是8080端口,有好几个端口,8080,8009,8005
ss -lntup|grep java
#关闭tomcat,注意tomcat关闭一般是比较慢的
/application/tomcat/bin/shutdown.sh
#关完之后一定要检查一下端口,还要检查下进程,注意一定要检查进程和端口都没了,才确保tomcat是关闭的,否则有的时候端口没了,进程还在,你再启动的话,就起了好几个tomcat,会有故障
ss -lntup|grep java
ps -ef|grep java
#我们再启动下
/application/tomcat/bin/startup.sh

#看启动日志的话主要看下面
org.apache.catalina.startup.Catalina.start Server startup in 1244 ms 表示你的服务启动了,看日志的话主要看startup字样
org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"] 看到这个表示关闭服务了

#tomcat和java开机自启动
chmod +x /etc/rc.d/rc.local
echo "/application/tomcat/bin/startup.sh" >>/etc/rc.d/rc.local

####在浏览器打开看下,能看到tomcat小狮子代表配置成功
http://10.0.0.9:8080

PS:
#如果防火墙开启的话,可能要防火墙添加8080端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload

============================================================
Tomcat目录结构说明
├── bin # startup.sh shutdown.sh catalina.sh(核心)
├── conf # server.xml(主配置文件) tomcat-users.xml
├── lib
├── LICENSE
├── logs # 日志目录 catalina.out tomcat实时日志
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp
├── webapps # 站点目录
└── work

cd /application/tomcat/
ll
tree -L 1
.
├── bin
├── conf
├── lib
├── LICENSE
├── logs
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp
├── webapps
└── work
或者
find -maxdepth 1
.
./RELEASE-NOTES
./NOTICE
./RUNNING.txt
./temp
./bin
./lib
./conf
./LICENSE
./webapps
./work
./logs


#bin目录放着tomcat里面的管理命令,主要用就这么几个,开启startup.sh 关闭shutdown,sh 有一些是bat是windows下使用的,sh是linux下使用的,所以tomcat兼容了linux 和win
#startup.sh还是shutdown.sh 最终都调用了一个叫catalina.sh,这是tomcat主脚本
ls bin/
bootstrap.jar configtest.bat setclasspath.sh tomcat-native.tar.gz
catalina.bat configtest.sh shutdown.bat tool-wrapper.bat
catalina.sh daemon.sh shutdown.sh tool-wrapper.sh
catalina-tasks.xml digest.bat startup.bat version.bat
commons-daemon.jar digest.sh startup.sh version.sh
commons-daemon-native.tar.gz setclasspath.bat tomcat-juli.jar

#tomcat的配置文件目录,核心的主配置文件叫server.xml,有点类似于我们的nginx.conf,其他都是为了他做铺垫
#tomcat-users.xml这是配置web页面管理tomcat用的,用来管理和控制tomcat,等下还会配置他
#这些配置文件很重要,他们的权限看好了,都是600
ll conf/
total 212
-rw------- 1 root root 12374 Sep 28 2015 catalina.policy
-rw------- 1 root root 7106 Sep 28 2015 catalina.properties
-rw------- 1 root root 1577 Sep 28 2015 context.xml
-rw------- 1 root root 3387 Sep 28 2015 logging.properties
-rw------- 1 root root 6458 Sep 28 2015 server.xml
-rw------- 1 root root 1744 Sep 28 2015 tomcat-users.xml
-rw------- 1 root root 1846 Sep 28 2015 tomcat-users.xsd
-rw------- 1 root root 167302 Sep 28 2015 web.xml

lib/一般是一些库文件,你如果要给tomcat增加一些插件和功能,可以把这些插件和功能放到lib
LICENSE是不用管了,什么许可证啥的,RUNNING.txt这些文本文件都不用管了

logs\就是日志的,日志目录,默认里面是空的没有文件,catalina.out文件是tomcat实时日志,主要的访问日志

ll /application/tomcat/logs/
-rw-r--r-- 1 root root 35545 Nov 6 20:52 catalina.2019-11-06.log
-rw-r--r-- 1 root root 29444 Nov 6 20:52 catalina.out
-rw-r--r-- 1 root root 0 Nov 6 20:31 host-manager.2019-11-06.log
-rw-r--r-- 1 root root 1948 Nov 6 20:52 localhost.2019-11-06.log
-rw-r--r-- 1 root root 705 Nov 6 20:52 localhost_access_log.2019-11-06.txt
-rw-r--r-- 1 root root 0 Nov 6 20:31 manager.2019-11-06.log

主要看的日志叫catalina.out,我们运维人员以及开发人员会经常看的
catalina.2019-11-06.log和catalina.out这两个文件中的日志其实是一模一样的
cd /application/tomcat/logs/

catalina.2019-11-06.log
catalina.out
/application/tomcat/bin/shutdown.sh
md5sum catalina.2019-11-06.log catalina.out
8317309f486c811f97229725c5d37a72 catalina.2019-11-06.log
8317309f486c811f97229725c5d37a72 catalina.out
或者
diff catalina.out catalina.2019-11-06.log

catalina.2019-11-06.log和catalina.out这两个文件有啥区别?
catalina.out这个文件的日志会不断的往这里写入,一直到磁盘满了,这个文件就会一直增大
那catalina.2019-11-06.log这个文件就是叫切割日志
catalina.out这个文件就是记录tomcat实时的信息
catalina.out # 实时记录tomcat运行信息,文件会越来越大,定时清空,catalina.out被切割之后,应该是会被清空,但是并没有,他会随着时间,这个文件会越来越大,所以最好对这个文件进行定时的清空,因为他有个切割日志就OK了
catalina.时间.log # catalina.out文件每天的日志切割文件,加上这个时间,每天切一次

每个站点访问日志

#这是管理我们这些主机的,管理主机操作日志,你在tomcat web页面上点点点就会有一些操作记录下来
host-manager.时间.log
#localhost这些都是访问日志
localhost_access_log.时间.txt
localhost.时间.log
#manager也是操作日志
manager.时间.log
但是现在这几个日志是空的,一个是host-manager,一个是manager
host-manager和manager都空的
localhost_acess_log访问日志
localhost这里没什么的

#localhost.2019-11-06.log简单的记录,关啊开啊等等,启动状态等等
cat localhost.2019-11-06.log


temp\是临时的
webapps\有点类似于我们的nginx的那个html目录,站点目录
work\了解下的,一个工作的目录

====================================================================
tomcat 管理功能

tomcat_users.xml用来管理和控制tomcat的管理功能的

什么是tomcat的管理功能?
http://10.0.0.9:8080/页面上右边有三个按钮
Server Status 状态的
Manager App 管理的
Host Manager host的
一开始点这三个按钮是点不进去的,点击都弹出要输入用户名和密码的对话框
这三个按钮叫tomcat的管理功能的

但是这种功能不要对外开放,一般也就是自己测试的时候用一用,实际生产环境中,不要开这个,太危险

怎么开启这个管理功能呢?
cd /application/tomcat/
#vim conf/tomcat-users.xml
#tomcat的所有配置文件,都是这种xml的格式,第一行就是配置了一些字符集,版本的等等,有点类似于shell脚本的第一行#!/bin/sh
#
#在上面粘贴,注意一定要保证这部分结束是,上面开始就是,结束就是
sed -i.ori '38a \n\n\n' /application/tomcat/conf/tomcat-users.xml

#类似以下
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">




#这里规定了几个rolename角色名字,例如manager-gui,相当于是功能,username就是用户名,密码,然后这个用户属于哪一个功能
#对应的是这个tomcat页面的三个按钮Server Status,Manager App,Host Manager点开来的页面

tail -5 /application/tomcat/conf/tomcat-users.xml
#改完配置文件,一定要记得重启tomcat
/application/tomcat/bin/shutdown.sh
#检查端口和进程还有没在运行
ss -lntup|grep java
ps -ef|grep java
/application/tomcat/bin/startup.sh
ss -lntup|grep java
ps -ef|grep java

##打开http://10.0.0.9:8080/
#点击Server Status按钮
账号密码输入tomcat
这里主要关注服务Server Information这一栏的信息就行
tomcat版本,JDK版本,系统,系统版本,主机名,ip地址等这些
然后下面的JVM内部的信息你了解一下,看一看就OK了,这个JVM更深入的可以不用太熟悉

#点击Manager App按钮
账号密码输入tomcat
Applications这个主要用来干什么?说你的这些目录,目录下都有什么,就是这种/docs
Deploy
WAR file to deploy还有可以在这来部署,我们不是部署过wordpress,那是PHP的,我们部署java的,其实就是各种的WAR包,网站程序的压缩包,可以在这上传
但是这种都是web页面的了,我们也可以不用这种

#点击Host Manager按钮
账号密码输入tomcat
Add Virtual Host这是虚拟主机的管理,他一般不在这管的

注意以上这三个功能还是比较危险的,实际工作生产环境不开就OK了

=======================================================================================

部署jpress站点(jpress类似wordpress是博客系统)
环境:开启web03和db01,Linux Tomcat JDK MySQL(Mariadb)

db01:
yum -y install mariadb-server
systemctl start mariadb.service
systemctl enable mariadb.service
mysql -uroot -poldboy123;
create database jpress DEFAULT CHARACTER SET utf8;
show databases;
grant all on jpress.* to jpress@'localhost' identified by '123456';
select user,host from mysql.user;
flush privileges;
按ctrl+d退出mysql模式

#试一下web03能否连到db01,但是web03没有mysql命令,从db01上复制一个过来
[root@web03 tomcat]# mysql
-bash: mysql: command not found
[root@web03 tomcat]#

到db01上输入命令
scp /application/mysql/bin/mysql 172.16.1.9:/bin/ 要输入yes 然后输入对边root的密码
mysql -uroot -poldboy123;
#数据库开启客户端用户远程访问
grant all on jpress.* to 'jpress'@'172.16.1.0/255.255.255.0' identified by '123456'
select user,host from mysql.user;

回到web03:
which mysql
mysql --version
ping 10.0.0.51
mysql -ujpress -p123456 -h 172.16.1.51;
ctrl+d 退出mysql

准备程序代码:
#程序代码上传到webapps目录
cd /application/tomcat/webapps/
ll
#上传jpress-web-newest.war文件(这个叫war包,本质就是个压缩包)到webapps,上传的这个war包,系统等会会自动帮你解压
rz
ll

切换到新的web03窗口,看下是否有解压日志:
tail -f /application/tomcat/logs/catalina.out
有以下日志
12-Nov-2019 22:02:20.441 INFO [localhost-startStop-3] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive /application/apache-tomcat-8.0.27/webapps/jpress-web-newest.war has finished in 5,501 ms

回到旧的web03窗口,ll可以看到已经解压了,多了个文件夹jpress-web-newest
ll

以上就是上传WAR 然后自动解压部署,这就是自动部署的功能

##在web页面部署我们的网站
浏览器输入以下网址:
http://10.0.0.9:8080/jpress-web-newest

回到db01,填写数据库信息之前,一定要确保数据库原来是没有表的,不然有表的话,会提示连接数据库不上
mysql -uroot -poldboy123;
show tables from jpress;
提示以下没有表
Empty set (0.00 sec)

回到浏览器:
点下一步-数据库名jpress,用户名jpress,密码123456,数据库主机172.16.1.51,点下一步-网站名称:老男孩教育-jpress,管理员oldboy,登录密码oldboy,点完成-页面虽然提示正在重启,实际不会自动重启,需要我们手动重启下-
/application/tomcat/bin/shutdown.sh
ss -lntup|grep java
ps -ef|grep java
#发现端口没了,但是进程还在
pkill java
pkill java
#OK了 进程已经没了
ps -ef|grep java
/application/tomcat/bin/startup.sh
#发现端口,进程都有了
ss -lntup|grep java
ps -ef|grep java

http://10.0.0.9:8080/jpress-web-newest/
http://10.0.0.9:8080/jpress-web-newest/admin/login
用户名密码都为oldboy,点登录按键
写篇文章

回到db01:
show tables from jpress;
+-------------------+
| Tables_in_jpress |
+-------------------+
| jpress_attachment |
| jpress_comment |
| jpress_content |
| jpress_mapping |
| jpress_metadata |
| jpress_option |
| jpress_taxonomy |
| jpress_user |
+-------------------+
8 rows in set (0.00 sec)

=====================================================================
###########Tomcat主配置文件介绍server.xml

cat /application/tomcat/conf/server.xml
#8005叫shutdown端口,意思是向8005这个端口中发送一些数据,你就能把tomcat关闭,你可以用telnet或nc向这个8005发送一个shutdown,注意大写的,你的tomcat就被关了,这个还是比较危险的,实际工作的时候会把这个端口,还有这个关闭的暗号给改掉

#这部分配置的是我们tomcat的这个管理功能和管理功能对应的文件tomcat-users.xml,但是注意,这个管理功能在实际的时候不要用,不要用它

type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />

#我们tomcat默认的访问端口8080,然后他用的协议,连接超时时间,这个单位不是秒,是毫秒,还有一个是跟HTTPS配置有关的8443就OK了
connectionTimeout="20000"
redirectPort="8443" />

#这个8009的这个叫AJP,这是一个接口,主要用来和Apache通信的,apache的,所以我们之后用nginx,可以不管

#这里面写的就是相当于是虚拟主机了,然后虚拟主机的名字name="localhost",appBase="webapps"这个站点目录,unpackWARs="true"是否自动解压这些WAR包,autoDeploy="true"是否自动部署,这两个都是true,所以会自动的去部署这个WAR包,解压和部署
#下面就是日志的格式,日志在这个目录directory="logs",日志前面是什么样的prefix="localhost_access_log",后面是什么样的suffix=".txt",日期的格式等等pattern="%h %l %u %t "%r" %s %b"
unpackWARs="true" autoDeploy="true">

    
    

    
    

例子:简化我们访问的路径
http://10.0.0.9:8080/jpress-web-newest/改为http://10.0.0.9:8080/jpress
目前http://10.0.0.9:8080/jpress打开提示404错误,找不着

在server.xml配置文件里加这么条命令,在sed -i.ori '125a ' /application/tomcat/conf/server.xml
cat /application/tomcat/conf/server.xml
调整下代码格式对齐即可
/application/tomcat/bin/shutdown.sh
#发现java进程还在没关掉,pkill杀掉
ps -ef|grep java
pkill java
ps -ef|grep java
/application/tomcat/bin/startup.sh

访问看看http://10.0.0.9:8080/jpress/,能访问了

#首先context这个path,这个就相当于我们nginx里面的location如果这个url是/jpress,我让你去这个站点目录/application/tomcat/webapps/jpress-web-newest,相当于是root,root是指定哪个站点目录,debug就是调试模式0,关闭,reloadable="false" crossContext="true"这两个先不管,这相当于是配置了我们这个tomcat的location规则似的
debug="0" reloadable="false" crossContext="true"/>

============================================
扩展:

cat /application/tomcat/conf/server.xml
#元素代表整个容器,是Tomcat实例的顶层元素.由org.apache.catalina.Server接口来定义.它包含一个元素.并且它不能做为任何元素的子元素.
#port指定Tomcat监听shutdown命令端口.终止服务器运行时,必须在Tomcat服务器所在的机器上发出shutdown命令.该属性是必须的.
#shutdown指定终止Tomcat服务器运行时,发给Tomcat服务器的shutdown监听端口的字符串.该属性必须设置

#
connectionTimeout="20000"
redirectPort="8443" />


详细说明:http://blog.oldboyedu.com/java-tomcat/

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












组件详解
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中。

=====================================================================

##########tomcat多实例
多虚拟主机:类似于nginx 多个Server标签(域名,ip,端口),进程数量固定 master+worker

多实例(多进程):同一个程序启动多次,分为两种情况:
第一种:一台机器跑多个站点;
第二种:一个机器跑一个站点多个实例,配合负载均衡

如果有一台配置很高的服务器,上面就跑一个nginx,和一个tomcat有点浪费资源了
内存要大,因为tomcat吃,消耗资源比较大
在一台机子上跑多个tomcat,叫tomcat的多实例

那多实例这个我们怎么来使用呢?首先你需要多个tomcat的软件,然后分别把他们启动下俩就可以了,但是有个前提,你得让这些软件启动之后,端口不能一样,就是这个

cd /server/tools/
ll
tar xf apache-tomcat-8.0.27.tar.gz
ll
#复制两份
cp -a apache-tomcat-8.0.27 tomcat_1
cp -a apache-tomcat-8.0.27 tomcat_2
ll
#把两个tomcat的端口改一下
sed -i 's#8005#8006#g' tomcat_1/conf/server.xml
sed -i 's#8080#8081#g' tomcat_1/conf/server.xml
sed -i 's#8009#8010#g' tomcat_1/conf/server.xml
sed -i 's#8005#8007#g' tomcat_2/conf/server.xml
sed -i 's#8080#8082#g' tomcat_2/conf/server.xml
sed -i 's#8009#8011#g' tomcat_2/conf/server.xml

diff /application/tomcat_1/conf/server.xml /application/tomcat_2/conf/server.xml

#移动到/application下
mv tomcat_* /application/
diff /application/tomcat_1/conf/server.xml /application/tomcat_2/conf/server.xml
ll
#分别启动下
/application/tomcat_1/bin/startup.sh
/application/tomcat_2/bin/startup.sh
#应该有3个关于java进程,一个是正常的tomcat,一个是tomcat_1,一个是tomcat_2
ps -ef|grep java
#创建测试文件,如果只是一个测试文件,要放到ROOT下面,tomcat真正的站点目录,这个根是叫ROOT
echo default-8080 >/application/tomcat/webapps/ROOT/index.jsp
echo default-8081 >/application/tomcat_1/webapps/ROOT/index.jsp
echo default-8082 >/application/tomcat_2/webapps/ROOT/index.jsp
#然后试一试
http://10.0.0.9:8080/
http://10.0.0.9:8081/
http://10.0.0.9:8082/
#部署好,调试好之后,你就可以直接把这些tomcat给他们打包,打完包之后,以后哪台机器在部署,直接解包,解压缩就可以了

生产经验:将已经配置的实例打包,以后方便批量配置多实例

cd /
tar zcf /server/tomcat_muti.tar.gz application/tomcat/ application/tomcat_1/ application/tomcat_2

=====================================================================
######tomcat与反向代理(Tomcat反向代理集群)
tomcat部署了这么多之后,那你到底用哪一台啊,就反向代理的集群,这里需要你在前面部署好nginx,然后把请求发到对应的tomcat上,只不过省事一点,你不用发给nginx了,再发给PHP下了,在tomcat中,直接反向代理,直接往后扔,扔到tomcat上就可以了
这里你要学会配置了
首先在负载均衡服务器上,配置一个池塘,配置这个池塘之后,然后再配置个location就可以了,往这个池塘里扔,只不过这里你不用写,你不用写80端口了,写的8081 8082就OK了,这里IP写9就可以了,这个你可以自己配置一下

在CentOS6的lb01操作,这里IP改成10.0.0.9就可以了,记得先lb01拍下快照

mv /application/nginx/conf/nginx.conf{,.ori}
egrep -v '#|^$' /application/nginx/conf/nginx.conf.default > /application/nginx/conf/nginx.conf
vim /application/nginx/conf/nginx.conf
cat /application/nginx/conf/nginx.conf
……
upstream web_pools {
server 10.0.0.9:8081;
server 10.0.0.9:8082;
}
……
location / {
root html;
index index.jsp index.html index.htm;
proxy_pass http://web_pools;
}

以下为主:
cat /application/nginx/conf/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream web_pools {
server 10.0.0.9:8081;
server 10.0.0.9:8082;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.jsp index.html index.htm;
proxy_pass http://web_pools;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

/application/nginx/sbin/nginx -t
/application/nginx/sbin/nginx -s reload

#关浏览器,再访问10.0.0.5 会自动跳到10.0.0.9:8081或者10.0.0.9:8082
http://10.0.0.5/

######zabbix监控tomcat
我们不用tomcat他自带的一些函数了,自带的函数你可以参考这 Tomcat自带函数检测:meminfo.jsp

<%
Runtime rtm = Runtime.getRuntime();
long mm = rtm.maxMemory()/1024/1024;
long tm = rtm.totalMemory()/1024/1024;
long fm = rtm.freeMemory()/1024/1024;

out.println("JVM memory detail info :
");
out.println("Max memory:"+mm+"MB"+"
");
out.println("Total memory:"+tm+"MB"+"
");
out.println("Free memory:"+fm+"MB"+"
");
out.println("Available memory can be used is :"+(mm+fm-tm)+"MB"+"
");
%>
把以上的追加到一个文件中,然后访问就可以了,这种不是太推荐的
cat > /application/tomcat/webapps/ROOT/meminfo.jsp <<%
Runtime rtm = Runtime.getRuntime();
long mm = rtm.maxMemory()/1024/1024;
long tm = rtm.totalMemory()/1024/1024;
long fm = rtm.freeMemory()/1024/1024;

out.println("JVM memory detail info :
");
out.println("Max memory:"+mm+"MB"+"
");
out.println("Total memory:"+tm+"MB"+"
");
out.println("Free memory:"+fm+"MB"+"
");
out.println("Available memory can be used is :"+(mm+fm-tm)+"MB"+"
");
%>
EOF

访问地址:http://10.0.0.9:8080/meminfo.jsp
JVM memory detail info :
Max memory:274MB
Total memory:105MB
Free memory:44MB
Available memory can be used is :213MB

#还有一些方法,叫jps -lvm
/
jps命令:jdk包带的命令,jps主要用来输出JVM中运行的进程状态信息。
语法格式:jps [options] [hostid]
如果不指定hostid就默认为当前主机或服务器。
参数说明:
-q 不输出类名、Jar名和传入main方法的参数
-m 输出传入main方法的参数
-l 输出main类或Jar的全名
-v 输出传入JVM的参数
/

jps -lvm #→快速获取Java进程的pid,不用ps和grep

jps -lvm
10417 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
4180 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
8362 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat_1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat_1/endorsed -Dcatalina.base=/application/tomcat_1 -Dcatalina.home=/application/tomcat_1 -Djava.io.tmpdir=/application/tomcat_1/temp
8394 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/application/tomcat_2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/application/tomcat_2/endorsed -Dcatalina.base=/application/tomcat_2 -Dcatalina.home=/application/tomcat_2 -Djava.io.tmpdir=/application/tomcat_2/temp

#jps是java用的ps命令,-lvm就能够显示这些详细的信息
#这里有几个呢?第一列是pid,为什么有4个pid?因为有一个就是jps命令它本身,这个是我们比较常用的一个命令,lvm就是显示详细信息,一般就是用jps这个命令获取pid号等等,jps你要用的话,需要安装jdk,这是一种方法


#还有一种,通过show-busy-java-threads,这是一个脚本,比较有名的脚本,那我们来试一下
#下载show-busy-java-threads.sh
mkdir -p /server/tools/
cd /server/tools/
curl -o show-busy-java-threads.sh https://raw.githubusercontent.com/oldratlee/useful-scripts/master/show-busy-java-threads
ll
#执行一下,他就会显示出繁忙的进程,比较繁忙的进程,这个一般是适用于排查一些故障的时候用的,这些一般都是我们手动用来监控够用的,手动来监控用的
sh show-busy-java-threads.sh
[1] Busy(0.0%) thread(10408/0x28a8) stack of java process(4180) under user(root):
"http-nio-8080-exec-6" #63 daemon prio=5 os_prio=0 tid=0x00007fa5103a4000 nid=0x28a8 waiting on condition [0x00007fa4df0f7000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)

  • parking to wait for <0x00000000f6bb69f0> (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)

假设我们找出了这个进程,这个pid号10408比较忙,你可以怎么的了?jstack加这个pid
jstack -h
jstack 10408
10408: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
一般加上jstack这个之后,就会有一些信息的,没有的话,我们就随便找一个
jps -lvm
用8394这个,他就有一些信息了
jstack 8394
2019-11-18 21:44:47
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.60-b23 mixed mode):

"Attach Listener" #28 daemon prio=9 os_prio=0 tid=0x00007f7c28005800 nid=0x2954 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"http-nio-8082-exec-6" #27 daemon prio=5 os_prio=0 tid=0x00007f7c50401800 nid=0x251c waiting on condition [0x00007f7c1f3fa000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)

  • parking to wait for <0x00000000f4f34eb8> (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)
    这些信息就是java内部的信息,一般java忙了,比如说sh show-busy-java-threads.sh这块就百分之好多啊,百分之九十多了,你找出来之后,就交给jstack,然后把下面信息就给开发人员进行处理就OK了

/*
jstack:主要用来查看某个Java进程内的线程堆栈信息。
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。

排除tomcat故障步骤
a. 查看catalina.out123456
b. sh show-busy-java-threads.sh

jconsole和jvisualvm
这是windows安装完jdk后的图形监控工具。
C:\Program Files\Java\jdk1.8.0_31\bin

*/

以上这些一般我们通过命令来排查


###Zabbix监控Tomcat
Zabbix通过JMX(Java Management Extensions)可以对Java Application进行监控,Zabbix利用原生的Zabbix Java gateway,一个Java守护进程监控JMX应用。当Zabbix想要知道某个JMX counter当前的数据时,它只去询问ZabbixJava gateway,而gateway会去查询需要的数据,所有这些查询都是通过JMX管理API完成的。

使用时,一个Java应用不需要额外安装任何其他的软件,也不需要实现或扩展新的代码来处理Zabbix的查询,仅仅需要在Java 应用的配置文件中设置一些参数,支持远程JMX的监控。

#Tomcat开启远程监控功能
#在catalina.sh的第97行,我们去改默认的tomcat就可以了
web03:
vim /application/tomcat/bin/catalina.sh +97
添加以下几行
#这几行的作用是什么?就是额外的一些参数CATALINA_OPT。有什么呢?jmxremote开启了远程监控的功能,jmxremote.port远程监控的端口12345,jmxremote.authenticate=false 是不是有验证?没有,jmxremote.ssl=false 有没有ssl?没有,hostname=172.16.1.9然后远程监控功能用的IP或者监听的地址是172.16.1.9,最好写内网的,因为这个远程功能还是比较危险的,别人能透过这个功能监控你服务器,查看你服务器里tomcat里的内部数据,所以监控的是内部的IP就OK了
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=172.16.1.9"

#做一下主机名解析
echo "10.0.0.9 web03" >>/etc/hosts
#配置完要记得重启,当然你不用这关也行,你用pkill
pkill java
pkill java
#把所有的java进程都干掉了
ps -ef|grep java
或者
/application/tomcat/bin/shutdown.sh

/application/tomcat/bin/startup.sh

#看下是否开启了远程监控功能,有了,有了远程监控的端口12345
ss -lntup|grep 12345

#然后还需要在web03上部署好zabbix客户端,那接下来你需要做的是在web03上部署好zabbix客户端,也不用,稍微说一下,为什么不用呢?因为zabbix监控tomcat,他用客户端是没有办法获取到这catalina.sh里面的远程的数据的,除非你用命令行自定义,自定义监控项,否则他没有办法获取到,那zabbix怎么来监控tomcat呢?用的一个叫JavaGateway,你需要去安装这个
到监控服务器m01上去:
#安装zabbix_java_gateway(java程序),也需要jdk(openjdk) (做1次)
rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
yum install zabbix-java-gateway -y

#配置服务端
vim /etc/zabbix/zabbix_server.conf
搜一下Java,搜索到# JavaGateway=
改成
JavaGateway=127.0.0.1
下面还有一个# JavaGatewayPort=10052,这是javagateway的端口,默认就可以了

StartJavaPollers=0

改成
#就是开始的时候运行多少个进程,用于java监控,javagateway能直接获取到我们这台tomcat服务器web03的,这台客户端的12345的信息配置
StartJavaPollers=5
#配置完之后重启一下zabbix服务端
systemctl restart zabbix-server.service

systemctl start zabbix-java-gateway.service
systemctl enable zabbix-java-gateway.service
#会看到10052端口,JavaGateway的端口,这个准备好之后,你只需要在web页面操作
ss -lntup|grep java
ping 172.16.1.9

#zabbix管理页面上操作,在这里我们克隆一个backup
配置-主机-点backup-点克隆-主机名称web03,群组取消Discovered hosts组,agent代理程序的接口点移除按钮,JMX接口点添加按钮,第一个格输入172.16.1.9,最后一个格输入12345
点模板-链接的模板模板都点取消链接按钮-链接指示器-输入JMX,选择Template App Apache Tomcat JMX点小添加-点大添加按钮-然后等着,web03的可用性的JMX变绿即可
这样就完成了对tomcat,通过javagateway的一个监控

=====================================================================
###tomcat安全优化及总结
面试必备
安全方面的优化
让你的tomcat以普通用户运行,不一定是root
监扰模式
第一个以普通用户运行,然后就是一些安全忧患
这个shutdwon端口,一定要给他改了,这个关闭的,关闭的暗号也要给他更改,更改为其他的
还有一个AJP的,AJP我们虽然不是太常用,但是也要把这个端口改掉
还有一个就是我们说的管理,就web页面管理,这些他能实现,是因为,他能实现是因为你这个/application/tomcat/webapps下,默认有很多的一些目录,你可以把这些默认的目录,把他们给删掉,有host-manager,有manager删掉,就留一个站点jpress-web-newest就OK了,就是禁用这种管理

降权启动:就以普通用户运行,这个降权启动也有一个别的名字叫监牢模式,也一定要做,tomcat比较容易做,nginx做起来就麻烦了,你的监牢模式要以普通用户运行的话,这个端口他必须大于1000,1000以内的端口必须root用,所以tomcat做起来比较容易
然后这里增加了一些访问的控制,可以配置一下,文件列表,文件列表就是不让你看我网站的目录,目录结构
当然这些版本,可以配置一下,这个版本的,还有刚才那个访问的,配置的是web.xml,因为他默认显示都会把你默认的版本,默认显示的都会把你的版本暴露,所以你可以指定一些新的,这种jsp文件,这些jsp文件,是你得写好的,要用默认的话,他又把你出卖了,这是显示版本信息的,还有其他的这些,这就熟悉了,一些访问控制的,类似于我们nginx的allow deny,对于一些比较危险的目录可以,可以增加这个,就什么什么路径,是这样的
然后我让你能访问或者不能访问等等
然后我们这些启动,关闭的脚本,把脚本的权限收回来,就不要给所有人都有执行权限,就变成744就行了,别是755的了
然后日志这个就OK了

这就是tomcat安全上的优化,是你要能说出来的,一个作业就是你要完成,我们tomcat的负载均衡,另外一个完成我们tomcat的监控,这是你要做的,然后就是这些能熟练的说出来

tomcat安全优化

扩展:
###Tomcat安全优化
关闭端口保护 8005 SHUTDOWN
ajp连接端口保护 8009 注释
禁用管理端
降权启动:降低用户权限启动
pkill java
useradd tomcat
cp -a /application/tools/tomcat8_1 /home/tomcat/
chown -R tomcat.tomcat /home/tomcat/tomcat8_1/
#-c command:变更账号为USER的使用者,并执行指令(command)后再变回原来使用者。
su -c '/home/tomcat/tomcat8_1/bin/startup.sh' tomcat

###Tomcat性能优化
tomcat性能取决于你的内存大小。

上策:优化代码
中策:jvm优化机制--垃圾回收机制,把不需要的内存回收
优化jvm--优化垃圾回收策略
优化catalina.sh配置文件。在catalina.sh配置文件中添加以下代码:
#tomcat分配1G内存模板
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"

下策:加足够大的内存
下下策:每天0点定时重启tomcat

=====================================================================

#Tomcat在CentOS7启动慢的原因
查看实时日志,发现原因是生成随机数的时候卡住了,导致tomcat启动慢。

是否有足够的熵来用于产生随机数,可以通过如下命令来查看
什么是熵?Linux 内核采用熵来描述数据的随机性,熵是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。
[root@oldboy tools]# cat /proc/sys/kernel/random/entropy_avail
7
为了加速/dev/random提供随机数的速度,你可以通过操作设备的外设,让其产生大量的中断(如网络传输数据,按键,移动鼠标,在命令行敲几个不同的命令,俗称聚气。
cat /dev/random 会消耗能量

yum install rng-tools # 安装rngd服务(熵服务,增大熵池)
systemctl start rngd # 启动服务


本文题目:tomcat总结
当前网址:http://6mz.cn/article/jhcpjc.html

其他资讯