基于Nginx反向代理与Keepalived构建高可用Web集群:负载均衡与故障自动切换实现

IT巴士 62 0

在当今数字化时代,Web服务的高可用性至关重要。用户期望无论何时访问网站或应用程序,都能获得快速且稳定的响应。为满足这一需求,通过Nginx反向代理和Keepalived配置实现负载均衡与故障自动切换,成为构建高可用Web集群的关键技术。

一、技术原理

(一)Nginx反向代理

Nginx是一款轻量级的高性能Web服务器、反向代理服务器及电子邮件(IMAP/POP3)代理服务器。在Web集群中,Nginx作为反向代理服务器,接收来自客户端的请求,并将这些请求转发到后端的真实服务器(Web服务器)。它可以根据配置的规则,如轮询、加权轮询、IP哈希等算法,将请求均匀地分配到不同的后端服务器上,从而实现负载均衡的功能。

(二)Keepalived

Keepalived是一个基于VRRP(Virtual Router Redundancy Protocol,虚拟路由器冗余协议)协议的高可用性解决方案。它的主要作用是防止服务器单点故障的发生。通过VRRP协议,Keepalived可以将两台或多台服务器虚拟成一个虚拟路由器,对外提供一个虚拟IP地址。在这个虚拟路由器组中,有一个主服务器(MASTER)和多个备份服务器(BACKUP)。正常情况下,主服务器负责处理请求,备份服务器处于监听状态。当主服务器出现故障时,备份服务器会自动接管主服务器的工作,继续提供服务,从而实现故障自动切换。

二、环境准备

假设我们有两台服务器,分别作为Nginx反向代理服务器的主节点和备节点,后端还有多台Web服务器提供实际的服务。具体的服务器信息如下:

  • Nginx主节点:192.168.1.10

  • Nginx备节点:192.168.1.11

  • 虚拟IP:192.168.1.20

  • 后端Web服务器:192.168.1.100、192.168.1.101、192.168.1.102

在开始部署之前,确保所有服务器都安装了操作系统(如CentOS 7),并且关闭了防火墙和SELinux,以避免对网络通信造成干扰。

三、安装与配置

(一)安装Nginx

  1. 更新系统软件包:在主节点和备节点上,首先更新系统软件包,确保系统是最新状态。使用命令:yum update

  2. 安装编译依赖:Nginx的编译安装需要一些依赖库,使用以下命令安装:yum install -y gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

  3. 下载Nginx安装包:从Nginx官方网站下载适合的安装包,例如:wget http://nginx.org/download/nginx-1.20.2.tar.gz

  4. 解压安装包:将下载的安装包解压到指定目录,例如:tar -zxvf nginx-1.20.2.tar.gz

  5. 编译安装Nginx:进入解压后的目录,进行编译和安装。执行以下命令:

cd nginx-1.20.2 
./configure --prefix=/usr/local/nginx --with-http_ssl_module 
make 
make install

(二)配置Nginx

在主节点和备节点上,对Nginx进行相同的反向代理和负载均衡配置。编辑Nginx的主配置文件/usr/local/nginx/conf/nginx.conf ,添加以下内容:

http { 
    upstream backend_servers { 
        server 192.168.1.100; 
        server 192.168.1.101; 
        server 192.168.1.102; 
    } 
     server { 
        listen 80; 
        server_name your_domain.com;  # 替换为你的域名或IP          location / { 
            proxy_pass http://backend_servers; 
            proxy_set_header X-Real-IP $remote_addr; 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
            proxy_set_header Host $host; 
        } 
    } 
}

(三)安装Keepalived

在主节点和备节点上,使用以下命令安装Keepalived:yum install -y keepalived

(四)配置Keepalived

  1. 主节点配置:在主节点(192.168.1.10)上,编辑Keepalived的配置文件/etc/keepalived/keepalived.conf ,添加以下内容:

global_defs { 
    notification_email { 
        your_email@example.com  # 接收通知的邮箱 
    } 
    notification_email_from keepalived@example.com  
    smtp_server 127.0.0.1 # 邮件服务器地址 
    smtp_connect_timeout 30 
    router_id NGINX_MASTER # 机器标识 
} 
 vrrp_instance VI_1 { 
    state MASTER 
    interface eth0 # 绑定的网卡 
    virtual_router_id 51 # 虚拟路由器ID 
    advert_int 1 # 检查间隔,单位秒 
    authentication { 
        auth_type PASS 
        auth_pass your_password # 认证密码 
    } 
    virtual_ipaddress { 
        192.168.1.20 # 虚拟IP 
    } 
}
  1. 备节点配置:在备节点(192.168.1.11)上,编辑Keepalived的配置文件/etc/keepalived/keepalived.conf ,与主节点配置类似,但有一些关键区别:

global_defs { 
    notification_email { 
        your_email@example.com  
    } 
    notification_email_from keepalived@example.com  
    smtp_server 127.0.0.1 
    smtp_connect_timeout 30 
    router_id NGINX_BACKUP } 
 vrrp_instance VI_1 { 
    state BACKUP 
    interface eth0 
    virtual_router_id 51 
    advert_int 1 
    authentication { 
        auth_type PASS 
        auth_pass your_password     } 
    virtual_ipaddress { 
        192.168.1.20 
    } 
    priority 90 # 优先级低于主节点 
}

(五)编写Nginx状态检测脚本

为了确保Nginx服务出现故障时能够及时切换,我们需要编写一个检测脚本,用于检测Nginx进程是否正常运行。在主节点和备节点上,创建脚本文件/etc/keepalived/check_nginx.sh ,内容如下:

#!/bin/bash count=$(ps -C nginx --no-header | wc -l) 
if [ $count -eq 0 ]; then     
    systemctl restart nginx 
    sleep 2 
    new_count=$(ps -C nginx --no-header | wc -l) 
    if [ $new_count -eq 0 ]; then         
        systemctl stop keepalived 
    fi 
fi

设置脚本权限:chmod +x /etc/keepalived/check_nginx.sh

(六)在Keepalived中关联检测脚本

/etc/keepalived/keepalived.conf 文件的vrrp_instance VI_1部分添加以下内容,使Keepalived能够调用检测脚本:

vrrp_script check_nginx { 
    script "/etc/keepalived/check_nginx.sh"      
    interval 2 # 每2秒执行一次脚本 
    weight -20 # 脚本执行失败(返回非0)则优先级减20 
} 

 track_script { 
    check_nginx 
}

四、启动与测试

(一)启动服务

在主节点和备节点上,分别启动Nginx和Keepalived服务:

systemctl start nginx 
systemctl start keepalived

并设置开机自启:

systemctl enable nginx 
systemctl enable keepalived

(二)测试负载均衡

通过浏览器访问虚拟IP(192.168.1.20),多次刷新页面,观察请求是否在后端的Web服务器(192.168.1.100、192.168.1.101、192.168.1.102)之间均匀分配,以此验证负载均衡功能是否正常。

(三)测试故障自动切换

在主节点上,停止Nginx服务或Keepalived服务,模拟主节点故障。然后再次通过虚拟IP访问Web服务,检查是否能够自动切换到备


标签: #Nginx反向代理 #Web集群