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

相关推荐
sszdzq1 小时前
docker 安装 Nginx
nginx·docker·容器
凤山老林1 小时前
Tomcat 高高在上?0-1 实现一个简单的 WEB 容器
java·后端·tomcat·web容器
_BugMan1 小时前
【SSE】
java·servlet·tomcat
kc胡聪聪12 小时前
nginx的性能优化与监控
运维·nginx·性能优化
zzh08115 小时前
nginx安全笔记
笔记·nginx·安全
A101693307115 小时前
Nginx 之Rewrite 使用详解
运维·nginx
lierenvip16 小时前
Spring Boot中Tomcat配置
spring boot·tomcat·firefox
Detachym16 小时前
InsightFlow 服务配置优化与部署实践
java·spring boot·tomcat·maven·状态模式·jar
vanvivo16 小时前
Nginx中如何配置WebSocket代理?
运维·websocket·nginx
Java小白笔记17 小时前
Nginx中配置IP白名单动态刷新
运维·tcp/ip·nginx