Tomcat单机多实例部署及管理
文章目录
[隐藏]
- 0x00 单机多实例概述
- 0x01 自动部署管理配置
- 1.添加tomcat更新启停控制脚本
- 2.添加总控制台脚本
- 0x02 开始初始化部署
单台机器部署多个 Tomcat, 每个Tomcat部署独立服务,Tomcat之间启停互不影响
不要问我为什么有这个需求, 复制粘贴就是干
0x00 单机多实例概述
大概的目录结构:
- CATALINA_HOME 为Tomcat应用程序运行程序及所需依赖
- CATALINA_BASE 即我们即将部署的程序
手动更改如下工作目录:
这是我自己个儿整的初始目录结构 download
war_apps #手动创建用来存放下载好的war包文件 tomcat #CATALINA_HOME ├── bin ├── INIT_APPS_FILE #CATALINA_BASE │ ├── conf │ ├── logs │ ├── temp │ ├── webapps │ └── work └── lib
然后呢正常的思路就是配置每个APP的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;
应用太多你难道要一个个手动改? no no no! 上脚本
0x01 自动部署管理配置
需要把应用war包传到可下载位置,来用于应用分发,我这里是直接传到了阿里云的oss桶里
1.添加tomcat更新启停控制脚本
需要安装unzip yum -y install unzip
manage.sh需要放在这里,也可以自定义改代码
war_apps #手动创建用来存放下载好的war包文件 tomcat #CATALINA_HOME ├── bin ├── manage.sh ├── INIT_APPS_FILE #CATALINA_BASE │ ├── conf │ ├── logs │ ├── temp │ ├── webapps │ └── work └── lib
蓝色块需要根据实际情况自定义, 应用名称, 和war包下载地址不需要写,后面的python总控制台会自动分配
manage.sh
#!/bin/sh # Author: Kionf # description: 启动tomcat多实例. # PATH=/opt/op/java/jdk1.8.0_172/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # 应用名称 app= # war包下载地址 war_url= soft_dir="/opt/op" download_war_file="${soft_dir}/war_apps/${app}.war" export CATALINA_BASE="${soft_dir}/tomcat/$app" export CATALINA_HOME="${soft_dir}/tomcat" export JVM_OPTIONS="-Xms528m -Xmx812m -Xmn328m" check(){ Pgrep java|grep -w ${CATALINA_BASE}|awk '{print $2}'` if [ -n "$PID" ];then echo -e "33[94m $app is running PID:$PID" running=`netstat -ntlp|grep $PID|grep 127.0.0.1` if [ -n "$running" ];then echo -e "33[92m $app is provide services33[0m " else echo -e "33[93m $app is running but not provide services33[0m" fi return 0 else echo -e "33[91m $app is dead33[0m " return 1 fi } start() { check if [ $? -eq 1 ];then echo -e "33[94m Start $app 33[0m" $CATALINA_HOME/bin/startup.sh >/dev/null 2>&1 fi } stop() { check if [ $? -eq 0 ];then echo -e "33[94m Stop $app33[0m" $CATALINA_HOME/bin/shutdown.sh >/dev/null 2>&1 kill -9 $PID fi } update() { echo "下载文件" wget ${war_url} -O ${download_war_file} > /dev/null 2>&1 if [ $? -eq 0 ];then cd ${CATALINA_BASE}/webapps/*/; unzip -q -o ${download_war_file} >/dev/null 2>&1 fi } log() { tailf ${CATALINA_BASE}/logs/catalina.out } if [ $# != "0" ];then case "$1" in start) start ;; stop) stop ;; restart) stop start ;; status) check ;; upgrade) stop update start ;; log) log ;; *) echo $"Usage: $0 {start|stop|restart|status|upgrade|log}" exit 1 ;; esac else start log fi
2.添加总控制台脚本
我就放在了/usr/local/bin下, chmod +x /usr/local/bin/tomcat_manager 蓝色部分需要根据自己需求更改 (支持python2)
/usr/local/bin/tomcat_manager
#! /usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/5/23 15:18 # @Author : Kionf # @FileName: tomcat_manager.py # # 初始配置并管理单例tomcat多应用 # import os import subprocess import sys import shutil # PATH = os.getcwd() PATH = "/opt/op/tomcat" #Tomcat目录 shell_script = os.path.join(PATH, "manage.sh") #更新启停管理脚本 INIT_FILES = os.path.join(PATH, "INIT_APPS_FILE") bucket = "https://oss.aliyuncs.com/tomcat_app/" # webapp下载地址 config_data = { # 应用名: [ServerPort, ConnectPort, AJPPort, RedirectPort, ] 'Application': ['8201', '8101', '8301', '8401', 'BaseApplication.war'], 'BaseNotify_Service': ['8202', '8102', '8302', '8402', 'BaseNotify_Service.war'], 'BaseUserCenter_Service': ['8203', '8103', '8303', '8403', 'BaseUserCenter_Service.war'], } def customize_print(msg, stat=0): if stat == 1: print("33[91m [ERROR]: %s 33[0m" % msg) elif stat == 0: print("33[92m [INFO]: %s 33[0m" % msg) elif stat == 2: print("33[93m [DEBUG]: %s 33[0m" % msg) class TomcatAppsManage: def __init__(self, webapp): self.name = webapp self.app_config = config_data[self.name] self.manage_shell_file = os.path.join(PATH, self.name, self.name) self.server_port, self.conn_port, self.ajp_port, self.redirect_port, self.app_war_name = self.app_config self.app_download_url = bucket + self.app_war_name self.config_file = os.path.join(PATH, self.name, 'conf/server.xml') self.webapp_dir = os.path.join(PATH, self.name) def create_app(self): """ 创建app :return: """ if not os.path.exists(self.webapp_dir): customize_print("创建APP: %s" % self.name) shutil.copytree(INIT_FILES, self.webapp_dir) os.mkdir(os.path.join(self.webapp_dir, "webapps", self.name.lower())) def config_app_port(self): customize_print("正在修改APP:%s 配置" % self.name) change_port = { 'ServerPort': "sed -i s'#Server port="[0-9]*"#Server port="" + self.server_port + ""#'g " + self.config_file, 'ConnPort': "sed -i s'#Connector port="[0-9]*" protocol="HTTP/1.1"#Connector port="" + self.conn_port + "" protocol="HTTP/1.1"#'g " + self.config_file, 'RedirectPort': "sed -i s'#redirectPort="[0-9]*"#redirectPort="" + self.redirect_port + ""#'g " + self.config_file, 'AjpPort': "sed -i s'#Connector port="[0-9]*" protocol="AJP/1.3"#Connector port="" + self.ajp_port + "" protocol="AJP/1.3"#'g " + self.config_file, } for port in change_port.keys(): # customize_print("修改 %s 端口" % port) os.system(change_port[port]) def config_app_manage_shell(self): customize_print("%s 添加管理脚本" % self.name) copy_shell_script = 'cp -f ' + shell_script + ' ' + self.manage_shell_file os.system(copy_shell_script) config_script_app_name = "sed -i 's/app=/app="" + self.name + ""/' " + self.manage_shell_file os.system(config_script_app_name) config_script_war_url = "sed -i 's#war_url=#war_url="" + self.app_download_url + ""#' " + self.manage_shell_file os.system(config_script_war_url) def status_app(self): """ :return: 0提供服务,1停止,2未提供服务 """ try: result = subprocess.check_output(['sh', self.manage_shell_file, 'status']) except subprocess.CalledProcessError as e: result = e.output if 'run' in result: if 'is provide services' in result: customize_print("应用 %s 成功启动并提供服务" % self.name) return 0 elif 'but' in result: customize_print("应用 %s 进程存在但未提供服务" % self.name, 2) return 2 else: customize_print("应用 %s 以停止" % self.name, 1) return 1 def manage(self, operate): os.system('sh %s %s' % (self.manage_shell_file, operate)) def init(self): self.create_app() self.config_app_port() self.config_app_manage_shell() self.manage("upgrade") self.manage("stop") def restart(self): self.manage("stop") self.manage("start") def start(self): self.manage("start") def stop(self): self.manage("stop") def log(self): self.manage("log") def upgrade(self): self.lock_config_file() self.manage("upgrade") def lock_config_file(self): cmd = 'find ' + self.webapp_dir + ' -name db*properties -o -name config_base_*|xargs chattr +i >/dev/null 2>&1' customize_print("锁配置文件", 2) os.system(cmd) def unlock_config_file(self): cmd = 'find ' + self.webapp_dir + ' -name db*properties -o -name config_base_*|xargs chattr -i >/dev/null 2>&1' customize_print("解锁配置文件", 2) os.system(cmd) def dash_board(apps, operate): """ 主管理程序,调用 :param operate: 应用操作 :param apps: apps 为list """ for app in apps: app_obj = TomcatAppsManage(app) main_dict = { "init": app_obj.init, "shell": app_obj.config_app_manage_shell, "status": app_obj.status_app, "start": app_obj.start, "stop": app_obj.stop, "restart": app_obj.restart, "upgrade": app_obj.upgrade, "log": app_obj.log, "lock": app_obj.lock_config_file, "unlock": app_obj.unlock_config_file, } try: main_dict[operate]() except KeyError as e: customize_print(help_msg) help_msg = """ 使用方法: 1 log all status 管理应用编号 操作 操作: lock 锁配置文件 unlock 解锁配置文件 init 配置tomcat监听端口 shell 配置webapp控制脚本 status,start,restart, log,upgrade,stop 应用操作 """ def main(): app_list = [] for index, app_name in enumerate(config_data, 1): print "33[94m %s: %s 33[0m" % (index, app_name) app_list.append(app_name) choice = raw_input("输入要管理的服务: ") try: app_index = choice.split()[0] operate = choice.split()[1] if app_index.isdigit(): app_index = int(app_index) if len(app_list) >= app_index > 0: app_name = app_list[app_index - 1] dash_board(app_name.split(), operate) elif app_index == "all": dash_board(app_list, operate) except ValueError and IndexError: customize_print("参数输入错误", 1) customize_print(help_msg) if __name__ == '__main__': try: dash_board(sys.argv[1].split(), sys.argv[2]) except IndexError: try: while True: main() except KeyboardInterrupt: customize_print("Bye!")
0x02 开始初始化部署
执行tomcat_manager
all init 自动初始化部署所有项目, 其他具体使用方法见帮助信息
原文出处:kionf -> https://kionf.com/2018/06/28/tomcat-multiple/
本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。