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

news/2024/7/10 3:03:22 标签: 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增强功能之负载均衡


http://www.niftyadmin.cn/n/5289796.html

相关文章

【头歌实训】Spark 完全分布式的安装和部署(新)

文章目录 第1关: Standalone 分布式集群搭建任务描述相关知识课程视频Spark分布式安装模式主机映射免密登录准备Spark安装包配置环境变量修改 spark-env.sh 配置文件修改 slaves 文件分发安装包启动spark验证安装 编程要求测试说明答案代码 第1关: Stand…

多维时序 | MATLAB实现SSA-GRU麻雀算法优化门控循环单元多变量时间序列预测

多维时序 | MATLAB实现SSA-GRU麻雀算法优化门控循环单元多变量时间序列预测 目录 多维时序 | MATLAB实现SSA-GRU麻雀算法优化门控循环单元多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现SSA-GRU麻雀算法优化门控循环单元多变量时间序列预…

django的gunicorn的异步任务执行

gunicorn 本身是一个WSGI HTTP服务器,用于运行Python的web应用,如Django项目。它并不直接提供执行异步任务的功能。异步任务通常是指那些你想要在web请求之外执行的后台任务,如发送电子邮件、处理长时间运行的计算或与外部API交互等。 在Dja…

数据挖掘(作业3

任务一 对以下数据集使用K均值聚类算法: 1)观察实验结果是否符合预期; 2)利用SSE标准确定K值; 3)自行调参并观察对聚类结果的影响。 注意:需要把类别信息去掉。 “tutorial3_Data Explorat…

Golang学习之路一三基本数据类型

Golang学习之路一三基本数据类型 基本数据类型 int8 是有符号类型,uint8 是无符号类型 go 语言中不同类型的数据不能相加,会编译错误 类型名称长度零值说明bool布尔类型1false值为 true 或 false, 不可以用数字代表byte字节型10uint8rune字符类型40专…

数据库01_增删改查

1、什么是数据?什么是数据库? 数据:描述事物的符号记录称为数据。数据是数据库中存储的基本对象。数据库:存放数据的仓库,数据库中可以保存文本型数据、二进制数据、多媒体数据等数据 2、数据库的发展 第一阶段&…

【docker实战】02 用docker安装mysql

本示例采用bitnami的镜像进行安装MySQL 一、镜像搜索 先搜索一下mysql有哪些镜像 [rootlocalhost ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql …

单片机外设矩阵键盘之线反转法识别原理与示例

单片机外设矩阵键盘之线反转法识别原理与示例 1.概述 这篇文章主要介绍单片机接收 4X4矩阵键盘发出的指令,做出对应的反馈。其中主要介绍矩阵键盘线反转方式的识别原理和实操。 2.矩阵键盘线反转识别原理 2.1.矩阵键盘硬件接线原理 矩阵键盘的硬件接线方式有多种…