JAVA企业级应用TOMCAT实战

一、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

1
2
3
4
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


1
2
3
4
5
6
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

微信截图_20171124102306.png

四、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。

<role rolename="manager-gui"/>

<role rolename="admin-gui"/>

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


/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、

新增以下内容

<Context path="" docBase="/application/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/>

<Context path="37team" docBase="/application/tomcat/webapps/memtest" debug="0" reloadable="false" crossContext="true"/>

上面两行的意思是,匹配"空"字段和“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 



1
2
3
4
5
6
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

<Server port="8005" shutdown="SHUTDOWN">


ajp连接端口保护 8009  注释即可

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />


禁用管理端: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收集的时间











本文转自 only223wym 51CTO博客,原文链接:http://blog.51cto.com/ymchaofeng/2043851,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值