Tomcat介绍
Tomcat服务器是一个免费的开放源代码的Web应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP网页的首选。 Tomcat和Nginx、Apache(httpd)、lighttpd等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Nginx/Apache服务器。 目前Tomcat最新版本为9.0。Java容器还有resin、weblogic等。 Tomcat官网:http://tomcat.apache.org/
常见的JAVA应用架构模型
tomcat处理JSP动态,还需要nginx处理静态的,要动静分离
JVM是tomcat中的核心
JVM介绍
JVM是Java Virtual Machine(Java虚拟机)的缩写。实现程序可移植
只要有JVM,就可以运行java程序,而JVM可以在任何系统运行
Java的特性:一次编译,到处运行
类比Vmware WorkStation的Linux系统
JDK(Java 语言的软件开发工具,包含JVM)种类:
- Oracle JDK:商业软件
- openjdk:开源软件
环境准备以及软件选择
从CentOS7模板机全新克隆2台新主机 第1台:IP规划为10.0.0.17/172.16.1.17,主机名为web03 第2台:IP规划为10.0.0.18/172.16.1.18,主机名为web04 准备好lb01(CentOS6),需要其上的nginx反向代理功能 创建目录/server/tools将apsche-comcat和jdk上传到web服务器中/server/tools 注:jdk和Tomcat的版本对运维来说没什么区别,安装方法高度一致。
下载软件
mkdir -p /server/tools cd /server/tools 下载comcat wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.38/bin/apache-tomcat-8.5.38.tar.gz下载jdk https://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html
安装JDK
创建目录/application重要提示:所有涉及到java应用都需要安装 tar xf jdk-8u60-linux-x64.tar.gz -C /application/ ln -s /application/jdk1.8.0_60 /application/jdk 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 # 让环境变量生效 java -version # 查看是不是安装好了# 注意:用echo想文件中添加多行的时候忙不解析内容中的$ 要使拥‘EOF,上面也可以用这种方法
安装Tomcat
tar xf apache-tomcat-8.0.27.tar.gz -C /application/ ln -s /application/apache-tomcat-8.0.27 /application/tomcat echo 'export TOMCAT_HOME=/application/tomcat'>>/etc/profile source /etc/profile# 有一个坑,我们正常解压出来的文件是属于root的,但是有的时候会显示成数字,表示用户不存在 chown -R root.root /application/jdk/ /application/tomcat/ /application/tomcat/bin/version.sh # 显示版本和系统配置
Tomcat目录结构说明
[root@web03 tools]# cd /application/tomcat/ [root@web03 tomcat]# tree -L 1 . ├── bin #命令 startup.sh shutdown.sh catalina.sh(核心) ├── conf # server.xml(主配置文件) tomcat-users.xml(配置外部页面管理tomcat) ├── lib 库文件,插件和功能 ├── LICENSE ├── logs # 日志目录 catalina.out tomcat实时日志 ├── NOTICE ├── RELEASE-NOTES ├── RUNNING.txt ├── temp ├── webapps # 站点目录 └── work 工作目录 7 directories, 4 files
目录中的文件中的bat是windows中用的,sh是Linux中用的
启动和关闭tomcat
/application/tomcat/bin/startup.sh /application/tomcat/bin/shutdown.sh启动后,可以查看日志tail -f /application/tomcat/logs/catalina.out netstat -tunlp|grep java 不要输成tomcat 在浏览器中输入http://10.0.0.17:8080/ # 关闭的时候,要检查端口和进程都没有了,才是真的关闭了# 否则在重新启动的时候,会启动几个一样的进程,会报错ss -lntup|grep javeps -ef |grep java
查看日志目录
通过md5 和 diff 对比catalina.20xx-xx-xx 和 catalina.out 发现这两个日志中的内容是一样的
查看日志,读懂日志 /application/tomcat/logs catalina.out # 实时记录tomcat运行信息,文件会越来越大,定时清空 catalina.时间.log # catalina.out文件每天的日志切割文件 # 每个站点访问日志 host-manager.时间.log 管理主机操作日志 localhost_access_log.时间.txt 访问日志 localhost.时间.log 访问日志 manager.时间.log 管理日志
Tomcat在CentOS7启动慢的原因
查看实时日志,发现原因是生成随机数的时候卡住了,导致tomcat启动慢。 是否有足够的熵来用于产生随机数,可以通过如下命令来查看 [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 管理功能(测试环境使用)
生产环境不要开启这个功能
[root@web03 webapps]# tail -4 /application/tomcat/conf/tomcat-users.xml到文件最后添加下面内容 <role rolename="manager-gui"/> <role rolename="admin-gui"/><role rolename="host-gui"> <user username="tomcat" password="tomcat" roles="manager-gui,admin-gui,host-gui"/> </tomcat-users> /application/tomcat/bin/shutdown.sh
ss -lntup|grep javeps -ef |grep java
/application/tomcat/bin/startup.sh在web页面中点击管理按钮,输入账号密码,默认都是tomcat
搭建Jpress
类似wordpess博客站点 环境:Linux Tomcat JDK MySQL(Mariadb) yum -y install mariadb-server systemctl start mariadb.service mysql create database jpress DEFAULT CHARACTER SET utf8; grant all on jpress.* to jpress@'localhost' identified by '123456'; grant all on jpress.* to jpress@'172.16.1.%' identified by '123456';flush privileges;# 可以连接另一台的mysql,只需要有命令文件即可,没有可以推一个或者拉一个过来# 是为了避免重复安装[root@web04 ~]# mysql -ujpress -p123456 -h 172.16.1.17 上传jpress-web-newest.war到/application/tomcat/webapps目录,过一会自动节解压了这是自动部署的功能,可以在日志中看到信息 http://10.0.0.17:8080/jpress-web-newest/ 网页安装跟着向导走,因为没有启动数据库服务器,暂时就使用本地服务器了
jpress不会自动重启,需要手动重启tomcat
[root@web03 webapps]# /application/tomcat/bin/shutdown.sh [root@web03 webapps]# ss -lntup|grep java [root@web03 webapps]# ps -ef |grep java #确保没有残留的进程,有就杀掉pkill java #重新启动 [root@web03 webapps]# /application/tomcat/bin/startup.sh #浏览器显示博客页面,部署成功 http://10.0.0.17:8080/jpress-web-newest/admin/login需要输入admin才能登陆 # 输入刚刚设置的账号密码,登陆,就可以发布文章了
Tomcat主配置文件介绍
文件位置/application/tomcat/conf/server.xml <Server port="8005" shutdown="SHUTDOWN"> # 向8005端口发送SHUTDOWN 就关闭了tomcat <Connector port="8080" protocol="HTTP/1.1" # 默认的访问端口, connectionTimeout="20000" 单位是毫秒 redirectPort="8443" /> 和http配置有关 <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> # 用来和apache通信 ,我们后面用nginx,可以不用管 # Host中的内容 就是虚拟主机
<Host name="localhost" appBase="webapps"149 unpackWARs="true" autoDeploy="true">150 151 <!-- SingleSignOn valve, share authentication between web applications152 Documentation at: /docs/config/valve.html -->153 <!--154 <Valve className="org.apache.catalina.authenticator.SingleSignOn" />155 -->156 157 <!-- Access log processes all example.158 Documentation at: /docs/config/valve.html159 Note: The pattern used is equivalent to using pattern="common" -->160 <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"161 prefix="localhost_access_log" suffix=".txt"162 pattern="%h %l %u %t "%r" %s %b" />163 164 </Host> 详细说明:http://blog.oldboyedu.com/java-tomcat/
现在来简化一下我们的访问路径
将http://10.0.0.17:8080/jpress-web-newest 改为http://10.0.0.17:8080/jpress
在配置文件中加上下面这行,记在Host标签内部
<Context path="/jpress" docBase="/application/tomcat/webapps/jpress-web-newest" debug="0" reloadable="false" crossContext="true"/>
重启后访问http://10.0.0.17:8080/jpress。确保都关闭了
访问成功!
Tomcat多实例
多虚拟主机:nginx 多个Server标签(域名,ip,端口),进程数量固定 master+worker 多实例(多进程):同一个程序启动多次,分为两种情况: 第一种:一台机器跑多个站点; 第二种:一个机器跑一个站点多个实例,配合负载均衡
应用场景:一台服务器部署多个网站,启动多个tomcat程序
再将tomcat复制两份
[root@web03 tools]# tar xf apache-tomcat-8.5.38.tar.gz [root@web03 tools]# cp apache-tomcat-8.5.38 tomcat_1 -a [root@web03 tools]# cp apache-tomcat-8.5.38 tomcat_2 -a #修改端口 [root@web03 tools]# sed -i "s#8005#8006#g" tomcat_1/conf/server.xml [root@web03 tools]# sed -i "s#8080#8081#g" tomcat_1/conf/server.xml [root@web03 tools]# sed -i "s#8009#8010#g" tomcat_1/conf/server.xml [root@web03 tools]# sed -i "s#8005#8007#g" tomcat_2/conf/server.xml [root@web03 tools]# sed -i "s#8080#8082#g" tomcat_2/conf/server.xml [root@web03 tools]# sed -i "s#8009#8011#g" tomcat_2/conf/server.xml #移动到application下 [root@web03 tools]# mv tomcat_* /application/ #启动! [root@web03 tools]# /application/tomcat_1/bin/startup.sh [root@web03 tools]# /application/tomcat_2/bin/startup.sh #创建测试文件!在webapps/ROOT 是默认的访问目录 [root@web03 tools]# echo default-8080 >/application/tomcat/webapps/ROOT/index.jsp [root@web03 tools]# echo default-8081 >/application/tomcat_1/webapps/ROOT/index.jsp [root@web03 tools]# echo default-8082 >/application/tomcat_2/webapps/ROOT/index.jsp 浏览器访问:http://10.0.0.17:8080/ http://10.0.0.17:8081/ http://10.0.0.17:8082/
Tomcat反向代理集群
# 在CentOS6的lb01操作 mv /application/nginx/conf/nginx.conf{,.ori} egrep -v '#|^$' /application/nginx/conf/nginx.conf.default > /application/nginx/conf/nginx.conf cat /application/nginx/conf/nginx.conf …… upstream web_pools { server 10.0.0.17:8081; server 10.0.0.17:8082; } …… location / { root html; index index.jsp index.html index.htm; proxy_pass http://web_pools; }
Tomcat监控
1、Tomcat自带函数检测:meminfo.jsp(不建议使用) 将函数写入文件,在浏览器访问? 2、jps命令:jdk包带的命令,jps主要用来输出JVM中运行的进程状态信息。 语法格式:jps [options] [hostid] 如果不指定hostid就默认为当前主机或服务器。 参数说明: -q 不输出类名、Jar名和传入main方法的参数 -m 输出传入main方法的参数 -l 输出main类或Jar的全名 -v 输出传入JVM的参数 jps -lvm #→快速获取Java进程的pid,不用ps和grep 3、jstack:主要用来查看某个Java进程内的线程堆栈信息。 jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。 排除tomcat故障步骤 a. 查看catalina.out b. sh show-busy-java-threads.sh 4、jconsole和jvisualvm 这是windows安装完jdk后的图形监控工具。 C:\Program Files\Java\jdk1.8.0_31\bin
tomcat开启远程监控
vim /application/tomcat8_1/bin/catalina.sh +97 修改文件第97行,版本不同行数也会不同# OS specific support. $var _must_ be set to either true or false.在这一行之前#加上下面的代码 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.17" # 监听的IP 要用内网,这个功能还是很危险的 # 主机名解析 echo "172.16.1.17 web03" >>/etc/hosts /application/tomcat8_1/bin/shutdown.sh /application/tomcat8_1/bin/startup.sh netstat -tunlp|grep 12345
java不是通过安装zabbix agent 来开启客户端监控的
而是用java-gateway,在zabbix服务器上安装
第一步:Zabbix Server 需要开启java监控功能(做1次) sed -i -e '220a JavaGateway=127.0.0.1' -e '236a StartJavaPollers=5' /etc/zabbix/zabbix_server.conf systemctl restart zabbix-server.service 第二步:安装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 -y install zabbix-java-gateway systemctl start zabbix-java-gateway.service netstat -tunlp|grep java 在http://10.0.0.61/zabbix/的WEB页面上添加主机移除agent代理添加JMX接口 第三步: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/ 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