解决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

相关推荐
程序员大金10 小时前
基于SpringBoot+Vue+MySQL的校园招聘管理系统
java·vue.js·spring boot·后端·mysql·tomcat·intellij-idea
-XWB-11 小时前
【安全漏洞-中间件】nginx版本号屏蔽
运维·nginx·中间件
苦逼IT运维17 小时前
正向代理与反向代理:原理、区别以及应用(Nginx 和 Tomcat)
运维·服务器·nginx·云原生·tomcat·devops
刘重洋17 小时前
Tomcat监控与调优:比Tomcat Manager更加强大的Psi-Probe
java·tomcat·psi-probe监控
会洗碗的CV工程师1 天前
828华为云征文|使用Flexus X实例创建FDS+Nginx服务实现图片上传功能
java·服务器·spring boot·nginx·华为云
程序那点事儿1 天前
open-resty 服务安装kafka插件
linux·分布式·nginx·kafka·lua·运维开发·openresty
苹果醋32 天前
idea环境下vue2升级vue3
java·运维·spring boot·mysql·nginx
弥琉撒到我2 天前
微服务nginx解析部署使用全流程
nginx·微服务·架构
打磨时间的针2 天前
Nginx的命令行控制
服务器·nginx