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

相关推荐
何中应3 天前
Nginx转发请求错误
前端·后端·nginx
大大水瓶4 天前
Tomcat
java·tomcat
芝士雪豹只抽瑞克五4 天前
Nginx 高性能Web服务器笔记
服务器·nginx
失重外太空啦4 天前
Tomcat
java·服务器·tomcat
屎到临头想搅便4 天前
TOMCAT
java·tomcat
失重外太空啦4 天前
nginx
运维·nginx
微风起皱4 天前
企业级WEB应用服务器TOMCAT
java·前端·tomcat
天蓝不会忘记024 天前
lvs,haproxy,keepalived,nginx,tomcat介绍和实验
nginx·tomcat·lvs
feng68_4 天前
Nginx高性能Web服务器
linux·运维·服务器·nginx