一、tomcat简介
Tomcat服务器是一个免费的开放源代码的Web应用服务器
静态文件:html css js jpg等
动态文件:文件中内容不固定,需要配合数据库获取完整信息
nginx http 只能处理静态文件
php 只能处理动态的php文件
tomcat web服务器==》处理静态页面 解析器==》处理动态的Java页面
注:php与java区别
1:java是半编译语言,php是脚本语言
2:java使用封装继承,最小的单位是类,php作为脚本,最小单位就是语句,用两者输出hello world就知道了,所以java语法比较严格,而php很灵活
3:java是自动内存分配回收,php是一次创建一次销毁,相同点:两者都不用考虑内存泄漏问题,不同点:java可以常驻内存,多线程;php无法常驻内存,也没有线程的概念
二、安装jdk(java 虚拟机 jvm)
jvm会将一份代码自动转换成不同平台的代码,类似php功能
环境检查
[root@oldboyedu ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
[root@oldboyedu ~]# uname -r
3.10.0-327.el7.x86_64
[root@oldboyedu ~]# getenforce
Disabled
[root@oldboyedu ~]# systemctl status firewalld.service
firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
[root@oldboyedu ~]# hostname -I
172.16.1.201 10.0.0.201 192.168.122.1
软件包下载:http://pan.baidu.com/s/1IpioA
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
2.1安装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 chown -R root.root /application/jdk/ /application/tomcat/ /application/tomcat/bin/version.sh
三、Tomcat目录介绍
[root@oldboyedu tomcat]# tree -L 1 .
.
├── bin # 启动,关闭命令
├── conf # 配置文件
├── lib
├── LICENSE
├── logs # 日志文件
├── NOTICE
├── RELEASE-NOTES
├── RUNNING.txt
├── temp
├── webapps #站点目录
└── work
#→启动程序/application/tomcat/bin/startup.sh
#→关闭程序/application/tomcat/bin/shutdown.sh
catalina.out tomcat实时日志(软件本身具有日志切割功能)
注: 如果catalina.out文件过大,直接清空内容。注意不能删除文件,因为程序正在使用,删除依然会继续占用系统空间,除非重启Tomcat,仅仅为了清理日志文件而重启Tomcat,这样做得不偿失。
>/application/tomcat/logs/catalina.out
四、Tomcat管理
4.1Tomcat服务启动时间慢并加快访问速度?
回翻日志文件可以看到如下行:
14-Nov-2017 05:53:00.512 INFO [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [27,970] milliseconds.
启动时间都花费在了session ID createSecureRandom上面,这个与系统的随机数有关。
通过命令查看随机数的值
cat /proc/sys/kernel/random/entropy_avail
注:每次使用命令“cat /dev/random”的时候就会消耗它的值。
解决方案: 安装rng-tools这个软件让其值变大
yum -y install rng-tools
systemctl start rngd.service
cat /proc/sys/kernel/random/entropy_avail
此时可以看到值为:2989, 容量槽值就变大了,此时再重启Tomcat,速度就非常快了
vim /application/tomcat/conf/tomcat-users.xml
4.2 tomcat用户管理
Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能,就需要配置管理用户,即配置前面说过的tomcat-users.xml。
/application/tomcat/bin/shutdown.sh
/application/tomcat/bin/startup.sh
五、自定义站点目录
vim /application/tomcat/conf/server.xml
方法1、
将meminfo.jsp或其他程序放在tomcat/webapps/ROOT目录下即可。因为默认网站根目录为tomcat/webapps/ROOT
方法2、
新增以下内容
上面两行的意思是,匹配"空"字段和“37team”字段,一旦匹配后,就指向实际站点目录/application/tomcat/webapps/memtest中。
ps:LINUX下打包压缩WAR和解压WAR包
因为种种原因需要把java程序达成war包。需要用jar命令,前提是要安装dk。
示例:
把当前目录下的所有文件打包成game.war
命令: jar -cvfM0 game.war ./
-c 创建war包
-v 显示过程信息
-f
-M
-0 这个是阿拉伯数字,只打包不压缩的意思
解压game.war
jar -xvf game.war #解压到当前目录
六、tomcat多实例
多实例:程序运行多次产生多个进程
多虚拟机:程序只是运行一次产生一个进程衍生出多个线程
默认 关闭 8005 第一个实例 8011 第2个实例 8012
默认 关闭 8080 第一个实例 8081 第2个实例 8082
tar xf apache-tomcat-8.0.27.tar.gz cp -a apache-tomcat-8.0.27 tomcat8_1 cp -a apache-tomcat-8.0.27 tomcat8_2 sed -i 's#8005#8011#;s#8080#8081#' tomcat8_1/conf/server.xml sed -i 's#8005#8012#;s#8080#8082#' tomcat8_2/conf/server.xml diff tomcat8_{1,2}/conf/server.xml
#压缩备份实例,便于日后使用并分发
tar zcf muti_tomcat.tar.gz ./tomcat8_1 ./tomcat8_2
cp -a tomcat8_1 tomcat8_2 /application/
#启动多实例
/application/tomcat8_1/bin/startup.sh
/application/tomcat8_2/bin/startup.sh
#查看端口和进程启动情况
[root@zabbix-proxy ~]# netstat -lntup|grep java
tcp6 0 0 127.0.0.1:8011 39534/java
tcp6 0 0 127.0.0.1:8012 39534/java
七、反向代理集群
安装nginx
yum -y install nginx
使用nginx+Tomcat反向代理集群
[root@tomcat ~]# vim /application/nginx/conf/nginx.conf
upstream web_pools {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.jsp index.html index.htm;
proxy_pass http://web_pools;
}
}
[root@tomcat ~]# /application/nginx/sbin/nginx -t (检查语法)
[root@tomcat ~]# /application/nginx/sbin/nginx
八、Jpress站点
jpress 类似wordpress
conflunce 至少2G
jira 至少2G
8.1 数据库
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';
8.2 上传代码到站点目录
cd /application/tomcat8_1/webapps/
mv jpress-web-newest jpress
mv jpress-web-newest.war /tmp/
http://10.0.0.201:8081/jpress/
九、 监控
9.1jps命令
jps命令用来输出java的状况信息,如:进程的PID值
#快速获取Java进程的pid,不用ps和grep
jps -lvm
jps -lvm 与ps -ef|grep java结果相同
9.2jstack命令
jstack命令主要用来查看某个java进程内的线程堆栈信息。
一旦发现Tomcat有严重异常,需要直接上脚本运行,查看结果
Tomcat Java脚本下载:https://github.com/wuyanteng/wuyanteng.github.io/tree/master/script
脚本输出结果可以看到哪些java进程占用多少资源?把结果与java开发分享一同解决问题。
比如:Tomcat运行特别卡,就使用这个查看即可。
[root@zabbix-proxy ~]# sh show-busy-java-threads.sh
9.3配置tomcat支持远程监控
[root@oldboyedu ~]# vim /application/tomcat/bin/catalina.sh +97
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.201"
echo "10.0.0.201 oldboyedu" >>/etc/hosts
/application/tomcat/bin/startup.sh
[root@oldboyedu logs]# netstat -tunlp|grep 12345
tcp6 0 0 :::12345 :::* LISTEN 10670/java
9.4使用zabbix监控tomcat
9.4.1. 配置Tomcat远程管理
添加hosts解析
vim /etc/hosts #必须添加hosts解析,否则启动失败
192.168.56.13 tomcat13
9.4.2.开启JMX远程监控
vim /application/tomcat/bin/catalina.sh
添加如下内容:
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.ssl=false #远程ssl验证为false
-Dcom.sun.management.jmxremote.authenticate=false #关闭权限认证
-Djava.rmi.server.hostname=192.168.56.13 #填写Tomcat IP地址
9.4.3.重启Tomcat
netstat -tunlp|grep 12345
################################
如果端口起不来,看日志
tail /application/tomcat/logs/catalina.out
9.4.4. zabbix-server上安装启动zabbix-java-gateway
yum install -y java java-devel zabbix-java-gateway
vim /etc/zabbix/zabbix_java_gateway.conf #java配置文件
JavaGateway=10.0.0.201 #gateway地址
StartJavaPollers=5 #预启动进程轮训个数
/etc/init.d/zabbix-java-gateway start
netstat -tunlp|grep java
9.4.5. 配置zabbix server支持java监控
#新增如下配置
sed -i -e '217a JavaGateway=127.0.0.1' -e '225a JavaGatewayPort=10052' -e '235a StartJavaPollers=5' /etc/zabbix/zabbix_server.conf
#重启zabbix server
9.4.6. zabbix web配置
配置 -- 主机 -- 添加主机 -- JMX接口: 10.0.0.201 端口:12345
模板:选择Template JMX Generic和Template JMX Tomcat
十、 优化
10.1 安全优化
关闭端口保护 8005
ajp连接端口保护 8009 注释即可
禁用管理端:webapps下面只保留一个ROOT空目录,其余的都清除
降权启动: 降权,降低权限,像nginx,tomcat等都支持以普通用户的方式启动
[root@oldboyedu ~]# useradd tomcat
[root@oldboyedu ~]# cp -a /application/tools/tomcat8_1 /home/tomcat/
[root@oldboyedu ~]# chown -R tomcat.tomcat /home/tomcat/tomcat8_1/
[root@oldboyedu ~]# su -c '/home/tomcat/tomcat8_1/bin/startup.sh' tomcat
Using CATALINA_BASE: /home/tomcat/tomcat8_1
Using CATALINA_HOME: /home/tomcat/tomcat8_1
Using CATALINA_TMPDIR: /home/tomcat/tomcat8_1/temp
Using JRE_HOME: /application/jdk
Using CLASSPATH: /home/tomcat/tomcat8_1/bin/bootstrap.jar:/home/tomcat/tomcat8_1/bin/tomcat-juli.jar
Tomcat started.
[root@oldboyedu ~]# ps -ef|grep java
tomcat 11436 1 40 17:54 ? 00:00:02 /application/jdk/bin/java -Djava.util.logging.config.file=/home/tomcat/tomcat8_1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/home/tomcat/tomcat8_1/endorsed -classpath /home/tomcat/tomcat8_1/bin/bootstrap.jar:/home/tomcat/tomcat8_1/bin/tomcat-juli.jar -Dcatalina.base=/home/tomcat/tomcat8_1 -Dcatalina.home=/home/tomcat/tomcat8_1 -Djava.io.tmpdir=/home/tomcat/tomcat8_1/temp org.apache.catalina.startup.Bootstrap start
root 11458 5390 0 17:54 pts/1 00:00:00 grep --color=auto java
10.2 性能优化
Tomcat是最消耗内存的,如果有无限大的内存,tomcat就跑的特别快。
优化方法:
1. 加大内存
2. 减少内存的消耗量:开发写得代码只是不停消耗内存,但是从来不释放
垃圾回收机制:定期扫描内存使用情况,找到未被使用的内存,回收
周期性
一定内存使用量
每次垃圾回收都会使业务停止
文档,jvm优化主要从垃圾回收策略开始阐述
3. 定期重启Tomcat
tomcat默认消耗1/4系统内存
4.jvm调优
Tomcat最吃内存,只要内存足够,这只猫就跑的很快。
如果系统资源有限,那就需要进行调优,提高资源使用率。
优化catalina.sh配置文件。在catalina.sh配置文件中添加以下代码:
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"
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收集的时间