聊聊 Tomcat 的单机多实例

Tomcat 的基本组成

了解一个事物的本质是现在就用它。不废话,直接先说一下 Tomcat 的安装和使用,

安装好之后,进入安装目录看一眼结构:

简单介绍一下各个文件夹及文件:

  • bin:主要存放脚本文件,例如比较常用的windows和linux系统中启动和关闭脚本
  • conf:主要存放配置文件,其中最重要的两个配置文件是server.xml和web.xml
  • lib:主要存放tomcat运行所依赖的包
  • LICENSE:版权许可证,软件版权信息及使用范围等信息
  • logs:主要存放运行时产生的日志文件,例如catalina.out(曾经掉过一个大坑)、catalina.{date}.log等
  • NOTICE:通知信息,一些软件的所属信息和地址什么的
  • RELEASE-NOTES:发布说明,包含一些版本升级功能点
  • RUNNING.txt:运行说明,必需的运行环境等信息
  • temp:存放tomcat运行时产生的临时文件,例如开启了hibernate缓存的应用程序,会在该目录下生成一些文件
  • webapps:部署web应用程序的默认目录,也就是 war 包所在默认目录
  • work:主要存放由JSP文件生成的servlet(java文件以及最终编译生成的class文件)

上面是一个安装后的 Tomcat 的全部组成部分,如果你要启动,进入bin目录执行startup.sh就可以了,接着就可以在浏览器输入http://localhost:8080/访问了。那么问题来了:当你有了三个、五个以及十个应用服务需要同时部署到同一台服务器上时,你的 Tomcat 服务正确启动方式是什么?是把上面文件全部复制出 N 多个目录么?还是有其他处理方式呢?

Tomcat 常见的几种部署场景

通常,我们在同一台服务器上对 Tomcat 部署需求可以分为以下几种:单实例单应用,单实例多应用,多实例单应用,多实例多应用。实例的概念可以理解为上面说的一个 Tomcat 目录。

  • 单实例单应用:比较常用的一种方式,只需要把你打好的 war 包丢在 webapps目录下,执行启动 Tomcat 的脚本就行了。
  • 单实例多应用:有两个不同的 Web 项目 war 包,还是只需要丢在webapps目录下,执行启动 Tomcat 的脚本,访问不同项目加上不同的虚拟目录。这种方式要慎用在生产环境,因为重启或挂掉 Tomcat 后会影响另外一个应用的访问。
  • 多实例单应用:多个 Tomcat 部署同一个项目,端口号不同,可以利用 Nginx 这么做负载均衡,当然意义不大。
  • 多实例多应用:多个 Tomcat 部署多个不同的项目。这种模式在服务器资源有限,或者对服务器要求并不是很高的情况下,可以实现多个不同项目部署在同一台服务器上的需求,来实现资源使用的最大化。-

这次其实要说的就是这种方式,但多个 Tomcat 就是简单的复制出一个新的 Tomcat 目录后改一下端口么?这样做也太 Low 了点吧?哈哈,其实并不是低端没技术含量的问题,当你同一台服务器部署了多个不同基于 Tomcat 的 Web 服务时,会迎来下面几个极其现实的问题。

  • 当你需要对数十台 Tomcat 版本进行升级的时候,你需要怎么做?
  • 当你需要针对每一个不同的 Web 服务分配不用的内存时,你需要怎么做?
  • 当你需要启动多台服务器时,你需要怎么做?

当然,好像上面的都不是很重要,注意,划重点,多实例部署最大作用就是最大化利用服务器资源。

说干就干,现在就开始干?

别着急别着急,先看一下官方文档怎么建议的。他们说可不建议你复制一个又一份的全部 Tomcat 目录进行多实例的部署,说安照下图可以实现更优雅的 Tomcat 单机多实例部署:

上图中的 CATALINA_HOME 指Tomcat安装路径,CATALINA_BASE 指实例所在位置。
CATALINA_HOME 路径下只需要包含 bin 和 lib 目录,而 CATALINA_BASE 只存放 conf、webapps、logs 等这些文件,这样部署的好处在于升级方便,配置及安装文件间互不影响,在不影响 Tomcat 实例的前提下,替换掉 CATALINA_HOME 中的安装文件。

流程清楚了,接下来才是真正的撸起袖子加油干了。

快来实践一下吧

你看到了这里肯定已经安装了 Tomcat 了,我现在演示用的是最新的 8.5.11 版本。

1.复制出两个 Tomcat 实例
在 Tomcat 安装路径的同一级目录下,新建两个tomcat-1、tomcat-2文件夹,先把安装路径下的 conf、webapps、temp、logs、work 这五个文件移动到tomcat-1实例中:

命令:

mkdir tomcat-1 tomcat-2
cd apache-tomcat-8.5.11
mv conf/ webapps/ temp/ logs/ work/ -t ../tomcat-1

接着把tomcat-1下的这几个文件再复制到tomcat-2中,直接命令:

cp tomcat-1/* tomcat-2

2.新建 Tomcat 启动、停止脚本
依然是在 Tomcat 安装路径的同一级目录下,新建两个tomcat-shell文件夹,用于存放启动和停止脚本,同时赋予文件全部权限。

命令:

cd tomcat-shell/
vim start_tomcat.sh
vim stop_tomcat.sh
chmod 777 start_tomcat.sh stop_tomcat.sh

tomcat-start.sh:

#!/bin/bashexport CATALINA_HOME=/software/apache-tomcat-8.5.11
export CATALINA_BASE=${1%/}echo $CATALINA_BASETOMCAT_ID=`ps aux |grep "java"|grep "Dcatalina.base=$CATALINA_BASE "|grep -v "grep"|awk '{ print $2}'`if [ -n "$TOMCAT_ID" ] ; then
echo "tomcat(${TOMCAT_ITOMCAT_ID}) still running now , please shutdown it firest";exit 2;
fiTOMCAT_START_LOG=`$CATALINA_HOME/bin/startup.sh`if [ "$?" = "0" ]; thenecho "$0 ${1%/} start succeed"
elseecho "$0 ${1%/} start failed"echo $TOMCAT_START_LOG
fi

tomcat-stop.sh:

#!/bin/bashexport CATALINA_HOME=/software/apache-tomcat-8.5.11
export CATALINA_BASE=${1%/}echo $CATALINA_BASETOMCAT_ID=`ps aux |grep "java"|grep "[D]catalina.base=$CATALINA_BASE "|awk '{ print $2}'`if [ -n "$TOMCAT_ID" ] ; then
TOMCAT_STOP_LOG=`$CATALINA_HOME/bin/shutdown.sh`
elseecho "Tomcat instance not found : ${1%/}"exitfiif [ "$?" = "0" ]; thenecho "$0 ${1%/} stop succeed"
elseecho "$0 ${1%/} stop failed"echo $TOMCAT_STOP_LOG
fi

这两个就是简单的脚本,其中传入了要启动的 Tomcat 实例所在的路径,当然,你也可以写一个重启的脚本,其实就是先停止再启动,还可以加入不同的 JVM 参数配置等等操作。
到这里,其实全部基础工作已经做好了。接下来我们看一眼整个多实例的目录结构:

3.配置 server.xml 端口
你知道的,同一个服务器部署不同 Tomcat 要设置不同的端口,不然会报端口冲突,所以我们只需要修改conf/server.xml中的其中前三个端口就行了。但它有四个分别是:

  • Server Port:该端口用于监听关闭tomcat的shutdown命令,默认为8005
  • Connector Port:该端口用于监听HTTP的请求,默认为8080
  • AJP Port:该端口用于监听AJP( Apache JServ Protocol )协议上的请求,通常用于整合Apache Server等其他HTTP服务器,默认为8009
  • Redirect Port:重定向端口,出现在Connector配置中,如果该Connector仅支持非SSL的普通http请求,那么该端口会把 https 的请求转发到这个Redirect Port指定的端口,默认为8443;

我这里把 tomcat-2 实例的 Connector Port 改为了 8081 ,并分别在 tomcat-1、tomcat-2 的 webapps/ROOT 目录下放入了一个页面文件,内容如下:(注意,这个页面文件必须叫  index.html )

<html>
<title>Tomcat-1</title>
<body>Hello Mafly! from Tomcat-1.
</body>
</html>

4.启动
直接通过执行我们刚写的脚本,传入某一个 Tomcat 实例路径即可来启动对应的 Tomcat。

命令:

/software/tomcat-shell/start_tomcat.sh /software/tomcat-1
/software/tomcat-shell/start_tomcat.sh /software/tomcat-2

去浏览器看一眼:

哈哈,可以了。接下来,停止或者重启什么的都一样,你可以根据需要来在单个服务器上创建更多的 Tomcat 实例,一切都看你喜欢。

tomcat单机多实例部署相关推荐

  1. Docker快速验证tomcat单机多实例方案

    为什么80%的码农都做不了架构师?>>>    Docker快速验证tomcat单机多实例方案 [TOC] 概述 主要讲的是解决问题的思路.当然也附带了尽可能详细的步骤,感兴趣的童鞋 ...

  2. mysql 单实例部署_Mysql 数据库单机多实例部署手记

    最近的研发机器需要部署多个环境,包括数据库.为了管理方便考虑将mysql数据库进行隔离,即采用单机多实例部署的方式. 找了会资料发现用的人也不是太多,一般的生产环境为了充分发挥机器性能都是单机单实例运 ...

  3. RabbitMQ集群(单机多实例部署)

    RabbitMQ集群(单机多实例部署) 一.单机多实例部署 单机版安装地址:RabbitMQ3.8.4安装和配置 在单机版基础上 ,也就是一台Linux虚拟机上启动多个RabbitMQ实例,部署集群. ...

  4. MySQL单机多实例部署详解之------利用mysqld_multi配置实现

    一.mysql多实例的原理 mysql多实例,简单的说,就是在一台服务器上开启多个不同的mysql服务端口(如3306,3307),运行多个mysql服务进程.这些服务进程通过不同的socket监听不 ...

  5. Tomcat单机多实例配置

    原文链接:http://blog.csdn.net/xyang81/article/details/51997053 当一个进程的线程超过500个的话,那么这个进程的运行效率会变得很低.因为一个进程产 ...

  6. rpm安装两个mysql_MySQL通过rpm安装及其单机多实例部署

    1. CentOS 下安装 MySQL Oracle 收购 MySQL 后,CentOS 为避免 MySQL 闭源的风险,改用 MySQL 的分支 MariaDB: MariaDB 完全兼容 MySQ ...

  7. Tomcat单机多实例

    参考:http://www.importnew.com/12553.html 在这篇文章中,我们将会看到在单机单用户基础上,如何运行多个tomcat实例. 我们首先看到的是tomcat的目录结构,其每 ...

  8. mac 启动mysql多实例_实践:mysql单机多实例部署(mac)

    背景:在自己电脑搭建或测试分布式服务框架时,经常会用多个数据库实例模拟多个环境的情况,因此我把搭建多实例mysql的过程记录下来,方便互相学习和沟通. 1.搭建环境 1) mac 电脑,版本 10.1 ...

  9. MySQL单机多实例部署详解之------多实例分别定义不同的配置文件

    mysql多实例安装---分别定义不同的配置文件 1.安装MySQL需要的依赖包 [root@MySQL ~]# yum install ncurses-devel libaio-devel cmak ...

最新文章

  1. Leetcode 153. 寻找旋转排序数组中的最小值 (每日一题 20211014)
  2. 全球及中国玩具收纳箱行业运营模式分析及产销需求预测报告2021年版
  3. fcn网络结构代码_FCN实现2-模型结构及实现
  4. [转载]一句话插配置文件
  5. 嵌入式 boa服务器移植
  6. python图形界面库哪个好_8个必备的Python GUI库
  7. linux 声明消息函数,linux消息队列函数--解析
  8. ZooKeeper观察员--ZooKeeperObservers
  9. javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint
  10. 2、Shiro的认证
  11. (日常搬砖)之environment.yml的使用
  12. 数据库并发中的串行化
  13. Vue实现打印机接口打印组件
  14. Kubesphere 多集群管理 启用多集群
  15. 串口服务器调试助手使用教程,串口服务器如何配置及串口调试6大技巧
  16. java毕业设计成品SpringBoot+VUE实现的电影院会员积分管理系统
  17. 客户端单周发版下的多分支自动化管理与实践
  18. uniapp小程序开发自定义相机、拍照、上传
  19. Java编写网络打字游戏
  20. 公网域名解析(转自华为云)

热门文章

  1. Xshell使用及训练深度学习模型;PyCharm连接服务器
  2. mui.plusReady有时会失效,解决办法
  3. 帽子与兔子的魔法(js事件处理)
  4. MySQL的时间类型
  5. Spring源码剖析-Spring如何处理循环依赖
  6. Plaidml--MAC+A卡的深度学习方案
  7. python网络请求模块_python学习笔记-day8-3-【python 网络请求及requests模块】
  8. Java输出一句话怎么输出多遍,java简单输出一句话
  9. 数据可视化第二版-03部分-07章-局部与整体
  10. 遭遇各种内容监管,有些企业到底欠缺的是什么,仅仅是价值观吗?