解决nginx+tomcat宕机完美解决方案

news/2024/10/3 19:41:55 标签: nginx, tomcat, firefox

问题描述:公司项目太老了,还是tomcat项目,部署两台tomcat,做了nginx负载。最近发现每到上午10,下午3点,tomcat就宕机了,死活找不到原因,客户影响超期差,实在让人头疼。

解决思路:写个脚本检测tomcat是否宕机,如果宕机就重启,每2分钟执行一次。(注意:为什么不是一分钟,因为我们系统太大,一分钟重启不了)。再写另外一个脚本,每秒执行一次,检测tomcat是否宕机,如果宕机就通过nginx切换到另外一台上,而不影响用户使用。

上代码哈哈哈~~~~

检测tomcat宕机自动重启脚本如下:
分别是monitorTomcat8082.sh和monitorTomcat8085.sh,由于两个代码类似,提供一个就能说明问题了

#!/bin/sh

# 获取tomcat进程ID  /usr/local/tomcat
TomcatID=$(ps -ef |grep tomcat8082 |grep -w 'tomcat8082'|grep -v 'grep'|awk '{print $2}')  

# tomcat启动程序(这里注意tomcat实际安装的路径)  

StartTomcat=/usr/local/web/tomcat8082/bin/startup.sh
ShutdownTomcat=/usr/local/web/tomcat8082/bin/shutdown.sh

# 定义要监控的页面地址  

WebUrl=http://localhost:8082

# 日志输出

TomcatMonitorLog=/usr/local/web/tomcat8082/logs/TomcatMonitor.log



Monitor()

{  

  echo "[info]开始监控tomcat...[$(date +'%F %H:%M:%S')]"  

  if [ $TomcatID ];then # 这里判断TOMCAT进程是否存在  

    echo "[info]当前tomcat进程ID为:$TomcatID,继续检测页面..."  

    # 检测是否启动成功(成功的话页面会返回状态"200")  

    TomcatServiceCode=$(curl -I -m 10 -o /dev/null -s -w %{http_code} $WebUrl)  

    if [ $TomcatServiceCode -eq 200 ];then  

        echo "[info]页面返回码为$TomcatServiceCode,tomcat启动成功,测试页面正常......"  

    else  

        echo "[error]tomcat页面出错,请注意......状态码为$TomcatServiceCode,错误日志已输出到$GetPageInfo"  

        echo "[error]页面访问出错,开始重启tomcat"  
		

        $ShutdownTomcat  

        sleep 3  

		rm -rf /usr/local/web/tomcat8082/bin/CATALINA_PID

        $StartTomcat  

    fi  

  else  

    echo "[error]tomcat进程不存在!tomcat开始自动重启..."  

    echo "[info]$StartTomcat,请稍候......"  

    #rm -rf $TomcatCache  

    $StartTomcat  

  fi  

  echo "------------------------------"  

}  

Monitor>>$TomcatMonitorLog

以上代码以上是 获取tomcat的进程号,如果不存在就代表没启动,启动。如果存在,就访问页面试试,如果没响应代表宕机了,就重新启动。

检测tomcat宕机切换到备用tomcat脚本如下:

分别是monitorNginx8082.sh和monitorNginx8085.sh,由于两个代码类似,提供一个就能说明问题了

#!/bin/bash



NginxID=$(cat /usr/local/nginx/conf/nginx.conf |  grep  'liuchongyang8082'| awk '{print $2}')


# 定义要监控的页面地址  

WebUrl=http://localhost:8082

# 日志输出

NginxMonitorLog=/usr/local/nginx/logs/NginxMonitorLog8082.log


Monitor()

{  

	echo "[info]开始监控tomcat8082...[$(date +'%F %H:%M:%S')]" 
  
  
    # 检测是否启动成功(成功的话页面会返回状态"200")  

    TomcatServiceCode=$(curl -I -m 10 -o /dev/null -s -w %{http_code} $WebUrl)  

    if [ $TomcatServiceCode -eq 200 ];then  

        echo "[info]页面返回码为$TomcatServiceCode,tomcat8082启动成功,测试页面正常......"  

    else  
	
		if [ $NginxID = 'liuchongyang8085' ];then
		
			echo "[error] 当前nginx配置文件已经是8085,无需切换!"
			
		else
		
			echo "[error]tomcat8082页面出错,请注意......状态码为$TomcatServiceCode,错误日志已输出到$GetPageInfo"  

			echo "[error]页面访问出错,开始切换备用程序 8085" 
			
			cp /usr/local/nginx/conf/nginx8085.conf /usr/local/nginx/conf/nginx.conf
			
			/usr/local/nginx/sbin/nginx -s reload
		fi

    fi  

  echo "------------------------------"  

}  



step=1 #间隔的秒数,不能大于60  
for (( i = 0; i < 60; i=(i+step) )); do  

	Monitor>>$NginxMonitorLog
    sleep $step  
done  
exit 0


以上代码以上是 访问页面试试,如果没响应代表宕机了,就切换到备用tomcat

至于 定时任务我使用的是centos自带的crontab服务。
第一个脚本每2分钟执行一次,第二个脚本每秒执行一次。
crontab只能每分钟执行一次,我是通过第二个脚本中用for循环和sleep做到的。

类似:

*/2 * * * *  sh  /usr/local/web/monitorTomcat8082.sh
*/2 * * * *  sh  /usr/local/web/monitorTomcat8085.sh


*/1 * * * *   bash  /usr/local/web/monitorNginx8082.sh
*/1 * * * *   bash  /usr/local/web/monitorNginx8085.sh

在Tomcat宕机了,monitorTomcat.sh脚本去调用bin/startup.sh 命令的时候,出现以下的错误

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

At least one of these environment variable is needed to run this
program

解决办法 : 在tomcat、bin目录下的 setclasspath.sh 文件头部加上以下两个参数(目的就是指定其JDK环境)

export JAVA_HOME=/home/boss_indb/software/jdk1.8.0_152

export JRE_HOME=${JAVA_HOME}/jre


http://www.niftyadmin.cn/n/5688885.html

相关文章

STM32使用Keil5 在运行过程中不复位进入调试模式

一、选择Options for Target进入设置 二、选择所使用的调试器&#xff0c;这里以ST-Link为例。取消勾选Load Application at Startup 可以在进入调试模式的时候不会从新加载程序&#xff01;从而不破坏现场 三、点击Setting进入 四、取消勾选Reset after Connect 使得调试器连接…

Pikachu-暴力破解-验证码绕过(on client)

访问页面&#xff0c; 从burpsuite 上看到返回的源代码&#xff1b; 验证码生成时通过 createCode 方法生成&#xff0c;在前端页面生成&#xff1b; 同时也是在前端做的校验&#xff1b; 直接验证&#xff1b;F12 -- 网络&#xff0c;随便输入个账号、密码、验证码&#xff0…

java基础 day1

学习视频链接 人机交互的小故事 微软和乔布斯借鉴了施乐实现了如今的图形化界面 图形化界面对于用户来说&#xff0c;操作更加容易上手&#xff0c;但是也存在一些问题。使用图形化界面需要加载许多图片&#xff0c;所以消耗内存&#xff1b;此外运行的速度没有命令行快 Wi…

掌握 C# 文件和输入输出操作

在任何编程语言中&#xff0c;文件和输入输出操作&#xff08;I/O&#xff09;都是非常重要的组成部分。C# 提供了一系列工具和类来帮助开发者处理文件的读取、写入、二进制文件的处理以及数据的序列化与反序列化。本文将介绍 C# 中的文件操作&#xff0c;包括 File 类、Stream…

计算机毕业设计Python+Spark知识图谱酒店推荐系统 酒店价格预测系统 酒店可视化 酒店爬虫 酒店大数据 neo4j知识图谱 深度学习 机器学习

《PythonSpark知识图谱酒店推荐系统》开题报告 一、研究背景与意义 随着互联网技术的飞速发展和人们生活水平的提高&#xff0c;旅游和酒店行业迎来了前所未有的发展机遇。然而&#xff0c;面对海量的酒店信息和多样化的用户需求&#xff0c;如何快速、准确地为用户推荐符合其…

鸿蒙ArkUI实战开发-主打自研语言及框架

ArkUI 是 HarmonyOS 的声明式 UI 开发框架&#xff0c;而 ArkUI-X 是基于 ArkUI 框架扩展而来的跨平台开发框架。ArkUI-X 支持 HarmonyOS、OpenHarmony、Android 和 iOS 平台&#xff0c;允许开发者使用一套代码构建支持多平台的应用程序。 一、ArkUI-X 的实战开发步骤 在实战开…

Java使用Redis的详细教程

Redis是一个基于内存的key-value结构数据库&#xff0c;即非关系型数据库&#xff0c;具有高性能、丰富的数据类型、持久化、高可用性和分布式等特点。在Java项目中&#xff0c;Redis通常用于缓存、分布式锁、计数器、消息队列和排行榜等场景。以下是在Java中使用Redis的详细教…

docker pull 超时Timeout失败的解决办法

当国内开发者docker pull遇到如下提示时&#xff0c;不要惊讶 [rootvm /]# docker pull postgres Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 128.121.146.235:443: i/o timeout [rootvm /]# 自2024…