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

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

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

上代码哈哈哈~~~~

检测tomcat宕机自动重启脚本如下:

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

bash 复制代码
#!/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,由于两个代码类似,提供一个就能说明问题了

bash 复制代码
#!/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做到的。

类似:

bash 复制代码
*/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

相关推荐
v***431734 分钟前
Nginx WebSocket 长连接及数据容量配置
运维·websocket·nginx
q***01651 小时前
【保姆级教程】apache-tomcat的安装配置教程
java·tomcat·apache
归叶再无青1 小时前
nginx从入门到实践全指南
运维·nginx·bash
n***26562 小时前
Nginx反向代理出现502 Bad Gateway问题的解决方案
运维·nginx·gateway
圣诞节不感冒2 小时前
nginx动态域名解析(利用变量触发域名动态解析)
运维·nginx
q***0564 小时前
Spring 中使用Mybatis,超详细
spring·tomcat·mybatis
李昊哲小课4 小时前
手写 Spring Boot 嵌入式Tomcat项目开发教学
spring boot·后端·tomcat
ttthe_MOon7 小时前
动静分离 + 负载均衡:Nginx 与 Tomcat 深度整合实战
nginx·tomcat·负载均衡
凯子坚持 c11 小时前
Docker实战深度解析:从Nginx部署到私有镜像仓库管理
nginx·docker·eureka
百***935016 小时前
Tomcat报404问题解决方案大全(包括tomcat可以正常运行但是报404)
java·tomcat