Java企业级应用TOMCAT实战

http://blog.oldboyedu.com/java-tomcat/ 老男孩笔记

常规应用架构模型

Tomcat对静态请求效率低,可以做动静分离,动态的给Tomcat静态的交给nginx

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/

JVM介绍

JVM是Java Virtual Machine(Java虚拟机)的缩写。
Java的特性:一次编译,到处运行
类比Vmware WorkStation的Linux系统

JDK(Java 语言的软件开发工具,包含JVM)种类:
Oracle JDK:商业软件
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安装

重要提示:所有涉及到java应用都需要安装

解压 到指定文件夹 创建好 软链接

tar xf jdk-8u60-linux-x64.tar.gz -C /application/
ln -s /application/jdk1.8.0_60 /application/jdk

追加变量到/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

# source /etc/profile

或 使用sed 添加

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

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/

执行version查看JVM和Tomcat版本 /application/tomcat/bin/version.sh

Tomcat目录结构说明

# cd /application/tomcat/
# tree -L 1
├── 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

或  # find -maxdepth 1

./bin
./conf
./lib
./logs
./temp
./webapps
./work
./LICENSE
./NOTICE
./RELEASE-NOTES
./RUNNING.txt

7 directories, 4 files

启动关闭tomcat

/application/tomcat/bin/startup.sh
/application/tomcat/bin/shutdown.sh

可以查看日志 看到启动 或关闭  catalina.out 主要日志

# tail -f /application/tomcat/logs/catalina.out

关完之后一定要检查端口和进程 是否都关闭了

# ss -lntup|grep java或# netstat -tunlp|grep java

# ps -ef|grep java

访问Tomcat   http://10.0.0.17:8080/

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 日志说明

查看日志,读懂日志  做个定时任务 情况catalina.out
/application/tomcat/logs
catalina.out                    # 实时记录tomcat运行信息,文件会越来越大,定时清空
catalina.时间.log            # catalina.out文件每天的日志切割文件

# 每个站点访问日志
host-manager.时间.log
localhost_access_log.时间.txt
localhost.时间.log
manager.时间.log

 tomcat 管理功能(测试环境使用)

默认是打不开的  正式环境中也不要启用它

vim /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"/>
</tomcat-users>

改完配置重启Tomcat

/application/tomcat/bin/shutdown.sh
/application/tomcat/bin/startup.sh

 

 搭建jpress(1)

类似wordpess博客站点  建议就用之前部署的mysql数据服务db01

进入mysql  添加用户

mysql  -uroot  -poldboy123

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';

查看用户

show databases;
+-----------------------------+
| Database                    |
+-----------------------------+
| information_schema   |
| jpress                          |
| mysql                          |
| performance_schema |
| test                              |
| wordpress                   |
+-----------------------------+

select user,host from mysql.user;

+--------------+--------------------------+
| user           |  host                       |
+--------------+--------------------------+
| root           |  127.0.0.1                |
| jpress        |  172.16.1.%            |
| wordpress |  172.16.1.0/255.255.255.0 |
| root           | ::1                            |
|                  | localhost                  |
| jpress        |  localhost                 |
| root           |  localhost                 |
| wordpress |  localhost                |
|                  | web01                     |
| root           |  web01                    |
+-----------+--------------------------+

更新权限

flush privileges;

把mysql命令推给web03

# scp /application/mysql/bin/mysql  172.16.1.9:/bin/

web03 连接mysql

# /bin/mysql -ujpress -p123456 -h 172.16.1.51

测试数据库能连接后 上传网站代码到以下路径目录中

# cd /application/tomcat/webapps/

上传的war包  jpress会自动解压部署 部署完进入数据库看看表信息是否正常创建

mysql> show tables from jpress;

浏览器进入http://10.0.0.9:8080/jpress-web-newest/ 安装

完成后 需要手动重启服务  jpress不会自动重启

# /application/tomcat/bin/shutdown.sh

# /application/tomcat/bin/startup.sh

管理 jpress需要手动输入

http://10.0.0.9:8080/jpress-web-newest/admin

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

环境: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';

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

Tomcat主配置文件介绍

/application/tomcat/conf/server.xml

<Server port="8005" shutdown="SHUTDOWN">  关闭端口 和“暗号”

<Connector port="8080" protocol="HTTP/1.1"  访问端口  协议

connectionTimeout="20000"                              超时时间  毫秒
redirectPort="8443" />

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
详细说明:http://blog.oldboyedu.com/java-tomcat/

 扩展知识

访问jpress地址为:http://10.0.0.200:8080/
访问jpress地址为:http://10.0.0.200:8080/jpress

vim /application/tomcat/conf/server.xml  在虚拟主机部分添加上以下内容
<Context path="/jpress" docBase="/application/tomcat/webapps/jpress-web-newest" debug="0" reloadable="false" crossContext="true"/>

访问http://10.0.0.9:8080/jpress/ 相当于访问http://10.0.0.9:8080/jpress-web-newest/

Tomcat多实例介绍

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

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

cd /server/tools/
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/conf/server.xml tomcat8_2/conf/server.xml
# 生产经验:将已经配置的实例打包,以后方便批量配置多实例
tar zcf tomcat_muti.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

netstat -tunlp|grep java

# 将每个实例的网页差异化
echo 8081 >>/application/tomcat8_1/webapps/ROOT/index.jsp
echo 8082 >>/application/tomcat8_2/webapps/ROOT/index.jsp

解压Tomcat 修改server.xml配置文件里的端口设置 在复制到application启动

在Tomcat 的root文件夹中加入默认页面测试

 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.9:8081;
server 10.0.0.9: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/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.17"
# 主机名解析
echo "10.0.0.17 web03" >>/etc/hosts

/application/tomcat/bin/shutdown.sh
/application/tomcat/bin/startup.sh
netstat -tunlp|grep 12345

 Zabbix监控Tomcat

第一步: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

第三步: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

六 java和Tomcat的更多相关文章

  1. 阿里云上安装mysql步骤/ 阿里云ECS搭建Java+mysql+tomcat环境

    使用阿里云ECS挺长一段时间了.这两天碰巧朋友小白让我一步一步教他在ECS上搭建Java+mysql+tomcat环境,所以把在这里把步骤在这简单整理了一下,以便需要的人查阅. 我购买的阿里云服务器系 ...

  2. Hbase深入学习(六) Java操作HBase

    Hbase深入学习(六) ―― Java操作HBase 本文讲述如何用hbase shell命令和hbase java api对hbase服务器进行操作. 先看以下读取一行记录hbase是如何进行工作 ...

  3. Java和Tomcat类加载机制

    转自:http://blog.csdn.net/codolio/article/details/5027423 加载类是运行程序的基础,了解Java和Tomcat的类加载机制对更有效地开发.调试Web ...

  4. C# 制作Java +Mysql+Tomcat 环境安装程序,一键式安装

    原文:C# 制作Java +Mysql+Tomcat 环境安装程序,一键式安装 要求: JDK.Mysql.Tomcat三者制作成一个安装包, 不能单独安装,安装过程不显示三者的界面, 安装完成要配置 ...

  5. Linux配置tomcat (centos配置java环境 tomcat配置篇 总结三)

    ♣下载安装tomcat7 ♣设置启动和关闭 ♣设置用户名和密码 ♣发布java web项目 声明:这篇教程是建立在前两篇教程的基础上的,所以,还没安装工具和jdk,可以先看这个系列的前面两篇(去到文末 ...

  6. 最受Java开发者青睐的Java应用服务器 —— Tomcat

    Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选.今天,就一起来了解下 Tomcat. Java 应用服务器 Tomc ...

  7. CentOS7下 Java、Tomcat、MySQL、Maven热部署

    本文介绍了CentOS7 64位下Java.Tomcat.MySQL.Maven热部署等服务器环境的搭建和调试过程. 学生服务器资源获取方法: 云+校园计划 - 腾讯云 阿里云云翼计划 github ...

  8. 部署Java和Tomcat

    Tomcat介绍 Tomcat服务器是一个免费的开放源代码的Web应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP网页的首选. Tomcat和Nginx.Apach ...

  9. Linux学习3-yum安装java和Tomcat环境

    前言 linux上安装软件,可以用yum非常方便,不需要下载解压,一个指令就能用yum安装java和tomcat环境. 前面一篇已经实现在阿里云服务器上搭建一个禅道系统的网站,算是小有成就,但并不是每 ...

随机推荐

  1. CentOS_7下安装MySQL

    卸载旧版本MySQl: 下载MySQ: MySQl官网:https://dev.mysql.com/downloads/mysql/ 版本自选,操作系统选Linux-Generic,64位系统或者32 ...

  2. 洛谷 P1903 [国家集训队]数颜色 / 维护队列

    墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会向你发布如下指令: 1. \(Q\) \(L\) \(R\) 代表询问你从第L支画笔到第R支画笔中共有几种不同 ...

  3. gcc编译C源文件

    gcc编译C程序的主要过程是:预处理---编译---汇编---连接,其中:(以名为hello.c的源文件为例) 预处理:对各种预处理指令(#开头,如#include,#define)进行处理,以及删除 ...

  4. re模块正则表达式

    regular expression / regex / RE 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配.Python 自1.5版本起增加了re 模块,它提供 ...

  5. 基于 Markdown 编写接口文档

    最近公司开发项目需要前后端分离,这样话就设计到后端接口设计.复杂功能需要提供各种各样的接口供前端调用,因此编写API文档非常有必要了 网上查了很多资料,发现基于Markdown编写文档是一种比较流行而 ...

  6. 浅议极大似然估计(MLE)背后的思想原理

    1. 概率思想与归纳思想 0x1:归纳推理思想 所谓归纳推理思想,即是由某类事物的部分对象具有某些特征,推出该类事物的全部对象都具有这些特征的推理.抽象地来说,由个别事实概括出一般结论的推理称为归纳推 ...

  7. 关于snmp octet string和普通string问题

    我是获取的Octet String用String输出,输出的是一连串的2个16进制数 空格.:然后想对输出结果操作,得到我想要的值. 解决方案:private static string exchan ...

  8. uCosII中的任务

    任务基本概念 任务是一个接受操作系统管理的独立运行单元,在uCosII中类似与普通平台上的main()函数,需要自己来保护其因调用或中断二产生的断点,所以需要一个自己的私有堆栈,即任务堆栈: 任务有两 ...

  9. Collections -- OrderedDict类

    普通dict(字典)在插入的时候并不记住元素的顺序,迭代器会根据散列表(哈希表)中存储的顺序来生成的.而OrderedDict则会记录元素的顺序,并且在迭代器输出时,会按现在记录的顺序进行遍历. 例: ...

  10. UOJ #460 新年的拯救计划

    清真的构造题 UOJ# 460 题意 求将$ n$个点的完全图划分成最多的生成树的数量,并输出一种构造方案 题解 首先一棵生成树有$ n-1$条边,而原完全图只有$\frac{n·(n-1)}{2}$ ...