- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章tomcat单机多实例的实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、前言 。
首先要回答一个问题,为什么要用单机多实例? 在不宕机的情况下,webapps里面存在多个项目,可能由于其中一个项目过度使用内存或者其他不确定的因素使得tomcat挂了,那么同一tomcat下的项目也会一同挂了;而使用不同的tomcat,同一台服务器下,每个tomcat的进程是不一样的额,一个项目出现问题tomcat挂了,那么由于是在不同进程,其他项目不会影响的。 还有一个问题就是不同tomcat使用了不同端口,最后域名只有一个怎么分配? 其实这个使用nginx的反向代理,根据请求的前缀,代理到相应的tomcat项目服务端口对应的nginx server即可.
2、系统环境 。
系统:16.04.5 lts jdk版本:openjdk 1.8 tomcat版本:apache-tomcat-9.0.13 。
3、环境搭建 。
3.1、下载tomcat 。
安装jdk:
1
|
apt-get install openjdk-
8
-jdk
|
访问官网:https://tomcat.apache.org/download-90.cgi 。
找到core,点击tar.gz带弹出下载连接复制下载地址。 然后使用命令下载tomcat 。
1
|
wget http:
//mirrors
.hust.edu.cn
/apache/tomcat/tomcat-9/v9
.0.13
/bin/apache-tomcat-9
.0.13.
tar
.gz
|
解压tomcat:
1
|
tar
-xzvf apache-tomcat-9.0.13.
tar
.gz
|
建一个程序目录:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
##创建一个程序目录
mkdir
/data
##移动解压文件到data目录下
mv
.
/apache-tomcat-9
.0.13
/data/
cp
/etc/profile
/etc/profile
.bak
echo
"export catalina_home=/data/apache-tomcat-9.0.13"
>>
/etc/profile
echo
"export path=\$path:\$catalina_home/bin"
>>
/etc/profile
&&
source
/etc/profile
##创建sh文件
touch
tomcat-start.sh tomcat-stop.sh
##更改权限
chmod
760
/data/tomcat-start
.sh
/data/tomcat-stop
.sh
|
备份profile,并写入tomcat的catalina_home到环境变量,激活环境变量.
创建 tomcat-start.sh,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#!/bin/bash
##这里的catalina_base,是当前脚本的的父目录,如果不在catalina_base的子目录的话,记得修改
export
catalina_base=$(
cd
$(
dirname
$0);
cd
.. ;
pwd
)
echo
$catalina_base
tomcat_id=`
ps
aux |
grep
"java"
|
grep
"dcatalina.base=$catalina_base "
|
grep
-
v
"grep"
|
awk
'{ print $2}'
`
if
[ -n
"$tomcat_id"
] ;
then
echo
"tomcat($tomcat_id) still running now , please shutdown it first"
;
exit
2;
fi
tomcat_start_log=`$catalina_home
/bin/startup
.sh`
if
[
"$?"
=
"0"
];
then
echo
"shell script: $0"
echo
"catalina_base: $catalina_base"
echo
"tomcat thread: $tomcat_id"
echo
"start succeed!!!"
else
echo
"$0 $catalina_base start failed"
echo
$tomcat_start_log
fi
|
创建 tomcat-stop.sh,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#!/bin/bash
##这里的catalina_base,是当前脚本的的父目录,如果不在catalina_base的子目录的话,记得修改
export
catalina_base=$(
cd
$(
dirname
$0);
cd
.. ;
pwd
)
echo
$catalina_base
tomcat_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`
else
echo
"tomcat instance not found : $catalina_base"
exit
fi
if
[
"$?"
=
"0"
];
then
echo
"shell script: $0"
echo
"catalina_base: $catalina_base"
echo
"stop succeed!!!"
else
echo
"$0 $catalina_base stop failed"
echo
$tomcat_stop_log
fi
|
复制两个tomcat
1
2
3
4
5
6
7
8
|
##完成删除lib和bin文件夹内容,生成空的bin文件夹
cp
-r apache-tomcat-9.0.13
/data/apache-tomcat-test1
&&
cd
/data/apache-tomcat-test1
&&
rm
-rf lib/ bin/ &&
mkdir
bin &&
cd
-
##复制启动和停止脚本到bin文件夹,带权限复制
cp
-p tomcat-start.sh tomcat-stop.sh
/data/apache-tomcat-test1/bin/
##一个同样的tomcat目录,带权限复制
cp
-rp
/data/apache-tomcat-test1/
/data/apache-tomcat-test2/
|
配置 server.xml 端口 。
你知道的,同一个服务器部署不同 tomcat 要设置不同的端口,不然会报端口冲突,所以我们只需要修改conf/server.xml中的其中前三个端口就行了。但它有四个分别是:
去掉注释的版本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
server
port
=
"8005"
shutdown
=
"shutdown"
>
<
listener
classname
=
"org.apache.catalina.startup.versionloggerlistener"
/>
<
listener
classname
=
"org.apache.catalina.core.aprlifecyclelistener"
sslengine
=
"on"
/>
<
listener
classname
=
"org.apache.catalina.core.jrememoryleakpreventionlistener"
/>
<
listener
classname
=
"org.apache.catalina.mbeans.globalresourceslifecyclelistener"
/>
<
listener
classname
=
"org.apache.catalina.core.threadlocalleakpreventionlistener"
/>
<
globalnamingresources
>
<
resource
name
=
"userdatabase"
auth
=
"container"
type
=
"org.apache.catalina.userdatabase"
description
=
"user database that can be updated and saved"
factory
=
"org.apache.catalina.users.memoryuserdatabasefactory"
pathname
=
"conf/tomcat-users.xml"
/>
</
globalnamingresources
>
<
service
name
=
"catalina"
>
<
connector
port
=
"8080"
protocol
=
"http/1.1"
connectiontimeout
=
"20000"
redirectport
=
"8443"
/>
<
connector
port
=
"8009"
protocol
=
"ajp/1.3"
redirectport
=
"8443"
/>
<
engine
name
=
"catalina"
defaulthost
=
"localhost"
>
<
realm
classname
=
"org.apache.catalina.realm.lockoutrealm"
>
<
realm
classname
=
"org.apache.catalina.realm.userdatabaserealm"
resourcename
=
"userdatabase"
/>
</
realm
>
<
host
name
=
"localhost"
appbase
=
"webapps"
unpackwars
=
"true"
autodeploy
=
"true"
>
<
valve
classname
=
"org.apache.catalina.valves.accesslogvalve"
directory
=
"logs"
prefix
=
"localhost_access_log"
suffix
=
".txt"
pattern
=
"%h %l %u %t "%r" %s %b"
/>
</
host
>
</
engine
>
</
service
>
</
server
>
|
tomcat-test1改为:
tomcat-test2改为:
修改标识:
1
2
|
echo
"test1"
> /data/apache-tomcat-test1/webapps/root/index.jsp
echo
"test2"
> /data/apache-tomcat-test2/webapps/root/index.jsp
|
修改完成,接着启动tomcat:
1
2
|
/data/apache-tomcat-test1/bin/tomcat-start
.sh
/data/apache-tomcat-test2/bin/tomcat-start
.sh
|
curl的时候是比较慢的,因为还没启动完成。启动完之后就好了.
1
2
|
curl 127.0.0.1:9010
curl 127.0.0.1:9020
|
这里注意访问端口是connector http port对应的端口 。
4、后记 。
其实搭起来不太难,经过参考文章的思路,就是公用一个tomcat的lib和bin,这样子升级的时候替换lib即可,bin都同一用catalina_home的脚本,其实catalina_home下的bin下的start和shutdown脚本统一调用了catalina.sh,而单机多实例的则是巧妙运用了catalina.sh是通过环境中的catalina_home和catalina_base变量启动tomcat的,通过改变catalina_base的路径达到同一条脚本启动tomcat在不同目录下.
5、问题 。
5.1、tomcat启动慢 。
可以看到因为生成session id用了1分06秒,太久了,导致应用deploying整体的时间大大增加,这个问题是可以解决的,可以再启动的时候增加jvm参数-djava.security.egd=file:/dev/./urandom,但是这样做应用产生随机数的能力被减弱,或者说随机不够均匀,对于经常使用加密的应用可能有安全影响。 修改一下启动脚本,添加了java_opts的设置,能使用java_opts,是因为catalina.sh会读出这个变量.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#!/bin/bash
##这里的catalina_base,是当前脚本的的父目录,如果不在catalina_base的子目录的话,记得修改
export
catalina_base=$(
cd
$(
dirname
$0);
cd
.. ;
pwd
)
echo
$catalina_base
tomcat_id=`
ps
aux |
grep
"java"
|
grep
"dcatalina.base=$catalina_base "
|
grep
-
v
"grep"
|
awk
'{ print $2}'
`
export
java_opts=
"-djava.security.egd=file:/dev/./urandom"
;
if
[ -n
"$tomcat_id"
] ;
then
echo
"tomcat($tomcat_id) still running now , please shutdown it first"
;
exit
2;
fi
tomcat_start_log=`$catalina_home
/bin/startup
.sh`
if
[
"$?"
=
"0"
];
then
echo
"shell script: $0"
echo
"catalina_base: $catalina_base"
echo
"tomcat thread: $tomcat_id"
echo
"start succeed!!!"
else
echo
"$0 $catalina_base start failed"
echo
$tomcat_start_log
fi
|
5.2、远程ssh时,环境变量不生效问题 。
使用source命令刷新当前环境变量.
具体修改如下:
tomcat-start.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#!/bin/bash
##这里的catalina_base,是当前脚本的的父目录,如果不在catalina_base的子目录的话,记得修政
source
/etc/profile
export
catalina_base=$(
cd
$(
dirname
$0);
cd
.. ;
pwd
)
export
java_opts=
"-djava.security.egd=file:/dev/./urandom"
;
tomcat_id=`
ps
aux |
grep
"java"
|
grep
"dcatalina.base=$catalina_base "
|
grep
-
v
"grep"
|
awk
'{ print $2}'
`
echo
"----------------------------------"
echo
"using catalina_base:$catalina_base"
echo
"using catalina_home:$catalina_home"
echo
"----------------------------------"
if
[ -n
"$tomcat_id"
] ;
then
echo
"tomcat($tomcat_id) still running now , please shutdown it first"
;
exit
2;
fi
tomcat_start_log=`$catalina_home
/bin/startup
.sh`
if
[
"$?"
=
"0"
];
then
echo
"shell script: $0"
echo
"tomcat thread: $tomcat_id"
echo
"start succeed!!!"
else
echo
"$0 $catalina_base start failed"
echo
"catalina_base: $catalina_base"
echo
$tomcat_start_log
fi
|
tomcat-stop.sh 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#!/bin/bash
## 这里的catalina_base,是当前脚本的的父目录,如果不在catalina_base的子目录的话,记得修政
source
/etc/profile
export
catalina_base=$(
cd
$(
dirname
$0);
cd
.. ;
pwd
)
tomcat_id=`
ps
aux |
grep
"java"
|
grep
"[d]catalina.base=$catalina_base "
|
awk
'{ print $2}'
`
echo
"----------------------------------"
echo
"using catalina_base:$catalina_base"
echo
"using catalina_home:$catalina_home"
echo
"----------------------------------"
if
[ -n
"$tomcat_id"
] ;
then
tomcat_stop_log=`$catalina_home
/bin/shutdown
.sh`
else
echo
"tomcat instance not found : $catalina_base"
exit
fi
if
[
"$?"
=
"0"
];
then
echo
"shell script: $0"
echo
"stop succeed!!!"
else
echo
"$0 $catalina_base stop failed"
echo
"catalina_base: $catalina_base"
echo
$tomcat_stop_log
fi
|
附上restart脚本: tomcat-restart.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#!/bin/bash
source
/etc/profile
export
catalina_base=$(
cd
$(
dirname
$0);
cd
.. ;
pwd
)
green_color=
'\e[1;32m'
#绿
res=
'\e[0m'
tomcat_id=`
ps
aux |
grep
"java"
|
grep
"dcatalina.base=$catalina_base "
|
grep
-
v
"grep"
|
awk
'{ print $2}'
`
sleep_time=1
echo
"----------------------------------"
echo
"using catalina_base:$catalina_base"
echo
"using catalina_home:$catalina_home"
echo
"----------------------------------"
if
[ -n
"$tomcat_id"
] ;
then
echo
-e
"${green_color}found tomcat instance in pid $tomcat_id , shutdown now!${res}"
;
echo
-e
"${green_color}---------------start shutdown-------------------${res}"
source
$(
dirname
$0)
/tomcat-stop
.sh;
echo
-e
"${green_color}--------------- end shutdown -------------------${res}"
fi
while
[ -n
"$tomcat_id"
]
do
sleep
$sleep_time
echo
wait
"$sleep_time"
s
tomcat_id=`
ps
aux |
grep
"java"
|
grep
"dcatalina.base=$catalina_base "
|
grep
-
v
"grep"
|
awk
'{ print $2}'
`
done
echo
-e
"${green_color}---------------start startup-------------------${res}"
source
$(
dirname
$0)
/tomcat-start
.sh
echo
-e
"${green_color}---------------end startup-------------------${res}"
|
参考博客:
聊聊 tomcat 的单机多实例 。
spring boot应用首次启动慢的问题 。
到此这篇关于tomcat单机多实例的实现的文章就介绍到这了,更多相关tomcat单机多实例内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/qq_26819733/article/details/84110648 。
最后此篇关于tomcat单机多实例的实现的文章就讲到这里了,如果你想了解更多关于tomcat单机多实例的实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
有没有一种方法可以使用标准类型构造函数(例如 int、set、dict、list、tuple 等)以用户定义的方式将用户定义类的实例强制转换为其中一种类型?例如 class Example:
我知道这个问题在Stackoverflow中有很多问题,但是即使有很多答案,这些答案也帮不了我什么,也没有找到答案。 在我的WebAPP中,它可以正常工作,但是当我将其转换为API时,它失败了(主题标
这个问题已经有答案了: Why does the ternary operator unexpectedly cast integers? (3 个回答) 已关闭 9 年前。 最近遇到一个Java的陷
我尝试使用 FirebaseApp.configure() 配置 Firebase,但遇到以下崩溃: *** Terminating app due to uncaught exception 'c
我有一个自连接员工实体类,其中包含与其自身相关的 id、name 和 ref 列。我想创建它的新实例并将其保存到数据库。 首先我创建了一个 Employee 类的实例并将其命名为 manager。然后
我有一个用于添加新公寓的表单,在该表单中我有一个下拉列表,用户可以在其中选择负责的人员。 显然,当您从下拉列表中选择并尝试保存公寓时,我的应用程序认为该人已被修改。它给了我下面的错误,指示我应该首先保
从 Visualforce 页面,我需要检索我们组织的 salesforce 实例的 URL,而不是 Visual Force URL。 例如我需要https://cs1.salesforce.com
我遇到了一些可能的问题答案,但这是关于从 Hibernate 3.4.0GA 升级到 Hibernate 4.1.8 的问题。所以这曾经在以前的版本下工作,我已经四处搜索了为什么它在这个新版本中出现了
似乎一遍又一遍地问这个问题,我仍然找不到解决我问题的答案。我在下面有一个域模型。每个新创建或更新的“安全用户”都需要我确保其具有配置文件,如果没有,则创建一个新的配置文件并分配给它。 配置文件的要求相
我很难调试为什么 JPA 不级联我的 @ManyToMany 关系。我发现的所有答案都与缺少级联语句有关。但我确实拥有它们并且仍然得到: Caused by: org.hibernate.Transi
Play 服务 API 表明有一个叫做 Instance ID 的东西 但是,在 Android Studio 中包含以下内容后,我无法导入 InstanceID 类 compile "com.goo
我正在使用 Seam 框架。我有 2 个实体: 请求.java @Entity @Table(name = "SRV_REQUEST") public class Request { private
This question处理构建一个适当的Monad来自单子(monad)的实例,但仅在某些约束下 - 例如Set .诀窍是将其包装成 ContT ,它将约束推迟到包装/展开其值。 现在我想对 Ap
我正在尝试执行此查询: StringBuffer sb = new StringBuffer(); sb.append("select p from PointsEntity p " + "where
我试图了解是否可以更改我的 hibernate 配置并使用单个 MySQL 实例(而不是我当前拥有的多个 MySQL 实例): 我有一个使用 hibernate 的 Java 应用程序,与 2 个模式
我有一个选项卡滑动布局,其中包括四个选项卡,每个选项卡都有自己的布局和 fragment ,在我的主要 Activity 布局中,viewpager 参与更改选项卡。特定 View (选项卡)在应用程
我看到很多帖子声称他们正在运行 MySql 的 RDS 实例,但无法连接到该实例,但我没有运行 RDS。 我使用 EC2 实例来托管我的 WordPress 博客,该博客是使用 Web 平台安装程序安
因为我在我的 ec-2 实例上的 python 虚拟环境中运行应用程序( Airflow ),并且我想在同一个 ec2 实例上的默认 python 环境中运行命令,所以我认为 ssh 到我自己的实例更
这个问题已经有答案了: How to fix the Hibernate "object references an unsaved transient instance - save the tra
例子: run APP1 .. ... run APP1 ... run APP2 如何在 APP2 中对 Vue 说我需要调用 APP1?
我是一名优秀的程序员,十分优秀!