当前位置: 首页 > news >正文

Nginx附-实战之负载均衡时怎么让请求不转发到一台正在启动的tomcat服务器上

问题描述

用nginx做负载均衡的时候,当一台挂掉的时候,请求会转发到另外一台。但挂掉这一台的tomcat服务在启动过程中,Nginx请求可能会转发到这台正在启动的服务器上,就会一直等待直到超时,前端使用者的体验就会很差。如何让Nginx等待tomcat启动完成后才转发请求到服务器呢?

解决方案

共有如下几种方式。

方式1

重启tomcat服务前,关闭tomcat服务端口:

firewall-cmd --zone=public --remove-port=8080/tcp --permanent  # 关闭8080端口
firewall-cmd --reload   # 使配置立刻生效

重启tomcat服务完成,开启tomcat服务端口:

firewall-cmd --zone=public --add-port=8080/tcp --permanent   # 开放8080端口
firewall-cmd --reload   # 使配置立刻生效

以上方式可编写成shell脚本执行,完整脚本如下:

#!/bin/bash
# 关闭端口
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
firewall-cmd --reload

tomcat_dir=/opt/tomcat
# 备份之前日志
mv -f $tomcat_dir/logs/catalina.out $tomcat_dir/logs/catalina.out.old
# 启动tomcat
$tomcat_dir/bin/startup.sh
# 监控是否启动完成
loopCount=0
while [ $loopCount -lt 100 ]
do
    # 根据启动日志检查 
    upCheck=`grep 'org.apache.catalina.startup.Catalina.start Server startup in' $tomcat_dir/logs/catalina.out`
    if [ -n "$upCheck" ]
    then
        break
    fi
    
    sleep 10
    loopCount=`expr $loopCount + 1`
done

# 开启端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload

对于非Nginx plus版本,建议采用该种方式。 

方式2

在重启前,手工修改Nginx配置文件,屏蔽掉这台机,用nginx -s reload在线更新配置。

启动好后,修改配置文件加回这台机,用nginx -s reload在线更新配置。

顺便说以下,通过设置 proxy_connect_timeout 1s;  不能解决问题。

方式3

在Nginx plus中,按如下方式简单设置即可:

upstream {
    # slow_start略大于服务启动到正常的时间
    server server1.example.com slow_start=20s; 
}

该种方式缺点是:不能支持hash、ip_hash和random负载均衡策略。

方式4

方式3不行的话,可用Nginx plus的主动健康检查功能。配置如下:

http {
    server {
        ...
        location / {
            proxy_pass http://backend; 
            # 启动健康检查
            health_check interval=2s fails=1 passes=2 uri=/chk_start.html match=welcome;
        }
    }
    # 状态码是 200,内容类型是 "text/html",
    # 正文包含 "I am ok!" 
    match welcome {
        status 200;
        header Content-Type = text/html; 
        body ~ "I am ok!";
    }
}

应用服务器根目录下chk_start.html内容如下:

I am ok!

详细参数说明见 Nginx Plus增强功能之负载均衡

相关文章:

  • MYSQL高级SQL语句
  • 嵌入式单片机的存储区域与堆和栈
  • 云原生机器学习平台cube-studio开源项目及代码简要介绍
  • 【QT】非常简单的登录界面实现
  • 同城配送小程序解决方案
  • 为什么react call api in cDidMount
  • SQL手工注入漏洞测试(MySQL数据库)
  • 【MySQL】:超详细MySQL完整安装和配置教程
  • 最新技术整理3款开源免费直播推流工具,实现实时视频推流、视频拉流,目标端可以是服务器、云平台、移动设备等(附源码)
  • C#与php自定义数据流传输
  • 免费的ChatGPT分享
  • axios进行图片上传组件封装
  • Android笔记(二十一):Room组件实现Android应用的持久化处理
  • 【网络安全 | 网络协议】结合Wireshark讲解TCP三次握手
  • ros2+gazebo+urdf:ros2机器人使用gazebo的urdf文件中的<gazebo>部分官网资料
  • 蓝牙物联网与嵌入式开发如何结合?
  • 人工智能:网络犯罪分子的驱动力
  • Unity网格篇Mesh(一)
  • Python五子棋程序实现详解
  • Android studio 使用greenDao根据实体类生成dao类
  • 抖音开展“AI起号”专项治理,整治利用AI生成低俗猎奇视频等
  • 铜川耀州窑遗址内违法矿场存在多年,省市区文物部门多次处罚叫停仍在生产
  • 发射后失联,印度地球观测卫星发射任务宣告失败
  • 芬兰西南部两架直升机相撞坠毁,第一批救援队已抵达现场
  • 浙江演艺集团7部作品组团来沪,今夏开启首届上海演出季
  • 上海比常年平均时间提前12天入夏,明天最高气温可达33℃