使用nginx在主备模式下,当主挂掉时,nginx自动切到备机上。当主服务在启动过程中,nginx就自动切换到主服务,这种情况就会导致访问失败问题。解决办法如下:
1、配置超时、错误自动跳转:
location / {
proxy_next_upstream error timeout http_500 http_502 http_504;
proxy_pass xxxx;
proxy_connect_timeout 11s;
proxy_send_timeout 21s;
proxy_read_timeout 15s;
}
2、以上配置基本可以解决大部分功能,但是部分功能还是会访问异常
这种情况,可以在nginx服务器上新增定时任务,定时访问主服务器,访问失败时,自动重新加载nginx配置。让nginx自动访问备服务器,等主服务器完全启动后再自动重新加载nginx配置,回复主备模式。
脚本如下:
#!/bin/sh
#nginx启动程序
Nginx=/usr/local/nginx/sbin/nginx
#定义主服务器页面地址
WebUrl=http://192.168.xxx
nginxStatus=$(cat /usr/local/nginx/tomcat.log)
echo $nginxStatus
GetPageInfo=/tmp/TomcatMonitor.info
#监控函数
Monitor()
{
#检测是否启动成功,成功的话页面返回状态(200)
TomcatServiceCode=$(curl -s -o $GetPageInfo -m 10 --connect-timeout 10 $WebUrl -w %{http_code})
if [ $TomcatServiceCode -eq 200 ]; then
if [ $nginxStatus -eq 1 ]; then
sed -ie 's/1/0/g' /usr/local/nginx/tomcat.log
/bin/cp -rf /usr/local/nginx/conf/master.conf /usr/local/nginx/conf/nginx.conf
$Nginx -s reload
echo "master normal"
fi
else
if [ $nginxStatus -eq 0 ]; then
sed -ie 's/0/1/g' /usr/local/nginx/tomcat.log
/bin/cp -rf /usr/local/nginx/conf/slave.conf /usr/local/nginx/conf/nginx.conf
$Nginx -s reload
echo "master err"
fi
fi
echo "----------------------------"
}
Monitor
tomcat.log内容默认为0,设置定时任务执行该脚本。crontab -e 加入定时任务:
*/1 * * * * /xx/xxx.sh
以上方案仅供参考。