Keepalived+Nginx+Tomcat 实现高可用Web集群的示例代码

Keepalived+Nginx+Tomcat 实现高可用Web集群的示例代码

简介

本文将介绍如何通过Keepalived+Nginx+Tomcat实现高可用Web集群,并提供示例代码。

准备工作

  • 3台服务器,主服务器A和两个备份服务器B和C,可任意选择物理机或虚拟机。
  • 安装CentOS 7.x操作系统。
  • 在每台服务器上安装Nginx和Tomcat,并且确保在Tomcat中正确部署Web应用程序。

Keepalived安装

在A、B和C三台服务器上均需安装Keepalived。以下是安装过程的简略步骤:

  1. 在每台服务器上安装必备软件包:

shell
yum install gcc kernel-devel kernel-headers make libnl-devel -y

  1. 下载并解压Keepalived软件包:

shell
wget http://www.keepalived.org/software/keepalived-2.0.19.tar.gz
tar zxvf keepalived-2.0.19.tar.gz
cd keepalived-2.0.19

  1. 编译和安装Keepalived:

shell
./configure --prefix=/usr/local/keepalived
make && make install

  1. 配置Keepalived:

在A、B和C三台服务器上都需要配置Keepalived,下面以服务器A为例:

  • 在A服务器上创建/etc/keepalived/keepalived.conf文件,写入以下内容:

    ```conf
    global_defs {
    router_id LVS_DEVEL
    }

    vrrp_script chk_nginx {
    script "/usr/bin/killall -0 nginx"
    interval 2
    weight 2
    }

    vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 200
    advert_int 1

     authentication {
         auth_type PASS
         auth_pass 1111
     }
    
     virtual_ipaddress {
         192.168.1.70
     }
    
     track_script {
         chk_nginx
     }
    

    }
    ```

    其中,vrrp_instance为Virtual Router Redundancy Protocol(虚拟路由器冗余协议)实例名称,virtual_router_id为虚拟路由器标识符,priority为本机优先级,virtual_ipaddress为虚拟IP地址,chk_nginx为检查nginx的脚本名称。

  • 启动Keepalived服务:

    shell
    /usr/local/keepalived/sbin/keepalived -f /etc/keepalived/keepalived.conf

  • 检查Keepalived的状态:

    shell
    ps -ef | grep keepalived

以上是服务器A的示例配置,服务器B和C的配置与A大致相同,只需修改vrrp_instance的state为BACKUP、priority为100即可。

Nginx配置

在每台服务器上均需安装Nginx并配置负载均衡。以下是配置过程的简略步骤:

  1. 安装Nginx:

shell
yum install nginx -y

  1. 修改Nginx配置文件/etc/nginx/nginx.conf,增加以下内容:
upstream tomcat {
    server 192.168.1.31:8080;  # 各个服务器IP地址以及Tomcat端口号
    server 192.168.1.32:8080;
    server 192.168.1.33:8080;
}

server {
    listen 80;

    location / {
        proxy_pass http://tomcat;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 记录客户端真实IP地址
        client_max_body_size 10m;
        client_body_buffer_size 128k;
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
        proxy_buffers 32 4k;
    }
}
  1. 启动Nginx服务:
systemctl start nginx
  1. 检查Nginx的状态:
systemctl status nginx

Tomcat配置

在每台服务器上均需安装Tomcat并部署Web应用程序。以下是部署过程的简略步骤:

  1. 安装Tomcat:

shell
yum install tomcat -y

  1. 修改/etc/systemd/system/tomcat.service文件,指定Tomcat的路径和端口号:
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target

[Service]
Type=forking

Environment=JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk/jre
Environment=CATALINA_PID=/opt/tomcat/temp/tomcat.pid
Environment=CATALINA_HOME=/usr/share/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment='CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'

ExecStart=/usr/share/tomcat/bin/startup.sh
ExecStop=/usr/share/tomcat/bin/shutdown.sh

User=tomcat
Group=tomcat
UMask=0007
RestartSec=10
Restart=always

[Install]
WantedBy=multi-user.target
  1. 启动Tomcat服务:

shell
systemctl start tomcat

示例1:

现在我们来模拟服务器A宕机的情况。在A服务器上停止Keepalived服务,此时B服务器将会接管A服务器的虚拟IP地址。

systemctl stop keepalived

接下来,我们在客户端发起请求,查看负载均衡是否正常:

curl http://192.168.1.70

若可以正常收到响应,则说明B或C服务器已经接管了A的虚拟IP地址,并且Tomcat应用也已经顺利转移。

示例2:

现在我们来尝试关闭Tomcat进程,观察负载均衡的表现。以服务器A为例,首先查找Tomcat进程的PID:

ps aux | grep tomcat

将返回如下结果:

tomcat     1734  1.2 24.9 3015168 254588 ?      Sl   08:20   0:55 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-1.el7_9.x86_64/jre/bin/java -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -classpath /usr/share/tomcat/bin/bootstrap.jar:/usr/share/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/opt/tomcat -Dcatalina.home=/usr/share/tomcat -Djava.io.tmpdir=/opt/tomcat/temp org.apache.catalina.startup.Bootstrap start
root       1305  0.0  0.0 112680   972 pts/0    S+   08:36   0:00 grep --color=auto tomcat

将Tomcat的进程ID(PID)记下来,并且杀掉该进程:

kill -9 1734

一段时间后,Tomcat进程会自动重新启动,接下来在客户端发起请求,查看负载均衡是否正常:

curl http://192.168.1.70

若可以正常收到响应,则说明Tomcat进程刚才已经自动重启,Web集群仍然正常工作。

结论

通过以上步骤,我们已经成功地使用Keepalived+Nginx+Tomcat实现了高可用Web集群。这种架构能够保证在出现硬件故障或软件故障时,仍可以实现高可用性,保证了Web应用的稳定性和可靠性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Keepalived+Nginx+Tomcat 实现高可用Web集群的示例代码 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Python+OpenCV读写视频的方法详解

    Python+OpenCV读写视频的方法详解 本文将介绍在Python开发环境下如何使用OpenCV读写视频,并提供示例代码以帮助读者更好地掌握该技术。 读取视频 使用OpenCV读取视频的步骤可以概括如下: 导入所需模块 import cv2 使用cv2.VideoCapture()函数创建一个视频对象,参数可以是视频文件的路径或者摄像头设备的编号 cap…

    人工智能概论 2023年5月25日
    00
  • 详解Django自定义图片和文件上传路径(upload_to)的2种方式

    Sure!下面是“详解Django自定义图片和文件上传路径(upload_to)的2种方式”的完整攻略。 方式1:在models.py中定义upload_to参数 在Django中,通常使用FileField或者ImageField来上传文件或者图片。这类字段包含一个upload_to参数,你可以指定这个参数来上传到自定义的路径。下面是示例代码: from …

    人工智能概览 2023年5月25日
    00
  • C语言实现将字符串转换为数字的方法

    让我来为你讲解“C语言实现将字符串转换为数字的方法”的完整攻略。 背景介绍 在C语言中,我们经常需要将字符串转换为数字,例如把从用户输入的字符串中提取出数字进行计算。而C语言中提供了两种将字符串转化为数字的方法,分别是atoi()和strtol()函数。接下来我将为大家介绍这两种方法及使用示例。 atoi()函数 atoi()函数可以将字符串转化为整数,其函…

    人工智能概览 2023年5月25日
    00
  • 手把手教你用SpringBoot将文件打包成zip存放或导出

    我来为您详细讲解一下“手把手教你用SpringBoot将文件打包成zip存放或导出”的完整攻略。 1. 背景信息 在进行Web开发过程中,经常会有需要将多个文件打包成一个压缩包进行存储或导出的需求。在SpringBoot中,我们可以使用Java自带的压缩工具类java.util.zip.ZipOutputStream来实现此功能。 2. 准备工作 首先,我们…

    人工智能概览 2023年5月25日
    00
  • 深入了解JavaScript发布订阅模式

    深入了解JavaScript发布订阅模式 什么是发布订阅模式? 发布订阅模式 是一种解耦的设计模式,它把服 务端提供的所有服务都抽象成订阅事件,客户端只需要订阅自己关注的服务即可,而不需要提前知道服务提供端的具体实现方式。服务端则维护着需要订阅的事件,同时维护了客户端列表,当某个事件被触发时,服务端向关注该事件的所有客户端发送通知。 实现发布订阅模式的步骤 …

    人工智能概览 2023年5月25日
    00
  • pytorch下的unsqueeze和squeeze的用法说明

    下面是关于“pytorch下的unsqueeze和squeeze的用法说明”的完整攻略: 1. 前言 unsqueeze和squeeze是PyTorch中常用的两个操作函数,主要用于增加和减少张量的维度。 2. squeeze squeeze函数可以删除维度为1的轴,把原本shape为(1, n)的tensor展开为形如(n,)的tensor。squeeze…

    人工智能概论 2023年5月25日
    00
  • django admin后台添加导出excel功能示例代码

    下面是django admin后台添加导出excel功能的完整攻略,包含两条示例说明。 1. 添加django-import-export库 在终端中运行以下命令,安装django-import-export库: pip install django-import-export 2. 在models.py中定义需要导出的模型 假设我们有一个模型叫做Perso…

    人工智能概览 2023年5月25日
    00
  • Python音频操作工具PyAudio上手教程详解

    Python音频操作工具PyAudio上手教程详解 PyAudio是一个Python模块,用于音频I/O,可用于录音和播放音频数据。在本文中,我们将详细介绍如何使用PyAudio来操作音频数据。 安装PyAudio 我们可以使用pip命令来安装PyAudio模块,打开终端或命令提示符,输入以下命令: pip install pyaudio PyAudio录制…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部