基于Keepalived+LVS+Nginx构建高可用高性能负载均衡架构

引言

在单节点部署的Nginx环境中,节点宕机会导致服务完全中断,同时受限于单节点性能(CPU、内存、网络带宽、连接数)难以支撑高并发场景。为了解决这些问题,本文将从各组件安装到配置以及部署来详细介绍Keepalived+LVS+Nginx的高可用架构是如何实现的。

一、什么是Nginx高可用

Nginx高可用是指通过LVS主从架构+Keepalived、Haproxy+Nginx集群等方案结合健康检查、故障自动转移确保服务持续稳定运行,最大限度减少停机时间。

二、核心术语解释

2.1 LVS(Linux Virtual Server)

  • 定义:Linux 内核级负载均衡器,提供四层(传输层)流量分发能力,支持多种负载均衡模式(如 NAT、DR、TUN)。
  • 作用:将客户端请求分发到多个 Nginx 服务器,提升系统吞吐量。

2.2 Keepalived

  • 定义:基于 VRRP(Virtual Router Redundancy Protocol) 协议的高可用解决方案,用于管理VIP的故障切换。
  • 作用:监控 LVS 节点状态,主节点故障时自动将 VIP 切换到备用节点,实现无缝切换。

2.3 Nginx

  • 定义:高性能的反向代理服务器,支持 HTTP/HTTPS 负载均衡、缓存加速等。
  • 作用:接收 LVS 分发的请求,进一步代理到后端应用服务器。

2.4 VIP(虚拟IP)

  • 定义:一个浮动 IP 地址,绑定到主备 LVS 节点,对外提供统一的访问入口。
  • 作用:当主节点故障时,VIP 会自动漂移到备用节点,对外保持服务可用性。

2.5 ipvsadm

  • 定义:用于配置 IPVS 规则的工具,可定义负载均衡策略、后端服务器组及调度算法。
  • 作用:ipvsadm 是构建高性能负载均衡集群的核心工具,适合需要横向扩展和高可用的大规模服务场景。

2.6 健康检查

  • 定义:通过定期探测后端服务端口或运行状态,判断节点是否存活。
  • 作用:Keepalived 内置对 LVS 和 Nginx 的健康检查机制,自动剔除故障节点。

三、Nginx高可用部署架构图

在这里插入图片描述
服务器规划

角色内网IP用途
Nginx Real Server1192.168.197.130运行Nginx
Nginx Real Server2192.168.197.131运行Nginx
LVS Director Master192.168.197.128运行Keepalived + LVS
LVS Director BackUP192.168.197.129运行Keepalived + LVS
VIP192.168.197.120客户端访问入口

四、Nginx的安装与配置

在linux环境中安装Nginx主要有以下四种方式

  • yum安装
    优点:从官方或第三方仓库获取预编译的包,自动解决包依赖问题,升级方便yum update。
    缺点:仓库中的版本可能滞后于官网最新版,无法灵活增减模块或修改编译参数,需要配置正确的yum源。

  • rpm安装
    优点:版本可控,可从 Nginx 官网下载特定版本的 rpm 包。
    缺点:依赖管理复杂,存在依赖冲突或缺少某些依赖的情况,升级需重新下载rpm包,无法自动更新,与 yum 安装类似,无法自定义模块和编译选项。

  • 源码安装
    优点:自由选择版本、自定义编译参数和快速集成第三方模块,针对服务器 CPU 架构优化,可第一时间使用官方最新版本或开发分支。
    缺点:需手动解决依赖(如安装 gcc、pcre-devel、zlib-devel),升级需重新编译,配置文件需手动迁移。

  • docker
    优点:容器化运行,避免与宿主机环境冲突,使用docker命令快速部署。
    缺点:需掌握docker和网络等方面的知识。

安装方式安装复杂度版本控制维护成本离线支持适用场景
yum⭐⭐⭐⭐⭐⭐⭐⭐快速部署标准版 Nginx,对版本无特殊要求
rpm⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐需特定版本但不想从源码编译的场景(漏洞修复)
源码编译⭐⭐⭐⭐⭐⭐⭐需要高性能、定制化配置,或对Nginx有深度优化需求的场景(健康检查)
docker⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐开发测试环境、云原生架构或需要快速复制多套 Nginx 实例的场景

本文采用源码进行安装,安装的服务器为192.168.197.130和192.168.197.131。

4.1 下载Nginx安装包
官网:https://nginx.org/en/download.html
选择linux稳定版本下载 在这里插入图片描述
4.2 上传安装包到服务器
在这里插入图片描述

4.3 安装依赖包

yum install -y gcc pcre-devel zlib-devel openssl-devel

❗使用yum命令安装依赖包时,需配置yum源(如阿里云yum源或者本地yum源)。由于Nginx 的某些核心功能依赖这些库的源代码(头文件和静态库)来实现编译和运行,因此在执行Nginx安装命令之前,需要安装这些依赖库,否则在执行./configure命令时会报以下错误。
在这里插入图片描述在这里插入图片描述
4.4 解压安装包

tar -zvxf nginx-1.26.3.tar.gz

4.5 执行configure命令检查Nginx安装环境和依赖关系并生成Makefile文件

./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_gzip_static_module
  • prefix:指定Nginx安装目录

  • with-http_ssl_module:提供HTTPS协议支持,需要安装OpenSSL library

  • with-http_v2_module:启用 HTTP/2 协议支持

  • with-http_gzip_static_module:支持发送预压缩的静态文件

    详细参数请参照官网配置文档
    https://nginx.org/en/docs/configure.html

4.6 安装Nginx

make && make install

4.7 关闭防火墙并启动Nginx服务

systemctl stop firewalld && systemctl disable firewalld #关闭防火墙(生产环境建议配置安全组规则)
/usr/local/nginx/sbin/nginx #启动Nginx服务

在这里插入图片描述
在这里插入图片描述

五、VIP与路由配置

5.1 配置本地回环接口定义VIP
同时在Nginx服务器192.168.197.130和192.168.197.131进行如下配置。

cd /etc/sysconfig/network-scripts
vi ifcfg-lo:1

将以下内容复制到ifcfg-lo:1文件中。

DEVICE=lo:1
IPADDR=192.168.197.120
NETMASK=255.255.255.255
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT=yes
NAME=loopback

5.2 重启网络服务

systemctl restart network 

5.3 配置arp抑制(DR模式必须配置)
同时在Nginx服务器192.168.197.130和192.168.197.131进行如下配置。

vi /etc/sysctl.conf

将以下内容复制到sysctl.conf文件中

net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

刷新配置文件

sysctl -p

5.4 添加路由
同时在Nginx服务器192.168.197.130和192.168.197.131进行如下配置。

echo "route add -host 192.168.197.120 dev lo:1" >> /etc/rc.local

避免每次系统重新启动,命令失效,
强制发往VIP 192.168.197.120 的流量严格通过 lo:1 接口处理。

六、Keepalived与ipvsadm安装与配置

同时在192.168.197.128和192.168.197.129安装Keepalived和ipvsadm。

6.1 下载Keepalived安装包
官网:https://www.keepalived.org/download.html
在这里插入图片描述

6.2 上传安装包到服务器
在这里插入图片描述

6.3 解压安装包

tar -zvxf keepalived-2.3.3.tar.gz

6.4 执行configure命令检查安装环境和依赖关系并生成Makefile文件

cd keepalived-2.3.3		
./configure --prefix=/usr/local/keepalived --sysconf=/etc

执行configure命令时,可能报以下警告信息。
在这里插入图片描述
安装相关依赖包,重新执行configure命令即可。

yum -y install libnl libnl-devel libnfnetlink-devel

6.5 执行make && make install安装Keepalived

make && make install

在这里插入图片描述在执行install时候会报IPV6_FREEBIND未定义错误,IPV6_FREEBIND 是 Linux 内核中用于 IPv6 套接字的选项(允许绑定未配置的 IP),需内核版本 ≥ 4.2 支持。旧版系统(如 CentOS 7 默认内核 3.10)不包含此宏定义,导致编译失败。
解决方案

  • 升级Linux内核
  • 修改keepalived源码兼容旧版本linux内核
    vi /usr/local/keepalived-2.3.3/keepalived/vrrp/vrrp.c
    
    将vrrp.c文件2717行替换成如下内容,并重新编译安装
    if (setsockopt(fd, IPPROTO_IP, IP_FREEBIND, &on, sizeof on))
    

6.6 注册Keepalived为系统服务

cp /usr/local/keepalived/keepalived/etc/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
systemctl daemon-reload #重新加载systemd系统管理器配置

6.7 修改Keepalived配置文件
修改主节点192.168.197.128上的配置文件.

vi /etc/keepalived/keepalived.conf

将以下内容复制内文件中(请根据实际情况调整配置文件参数)。

! Configuration File for keepalived

global_defs {
   router_id LVS_128
   lvs_flush 0
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 41
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.197.120
    }

    # Allow packets addressed to the VIPs above to be received
    accept
}

# 配置集群访问的地址
virtual_server 192.168.197.120 80 {
    # 健康检查时间,单位秒
    delay_loop 6
    # 配置负载均衡算法,默认轮询
    lb_algo wrr
    # 设置LVS的模式,NAT|TUN|DR
    lb_kind DR
    persistence_granularity src_ip+src_port
    # 设置会话持久化时间
    persistence_timeout 5
    # 协议类型
    protocol TCP

    real_server 192.168.197.130 80 {
        weight 1
        TCP_CHECK {
	  connect_port 80
	  connect_timeout 2
	  nb_get_retry 2
	  delay_before_retry 3
        }
    }
    real_server 192.168.197.131 80 {
        weight 1
	TCP_CHECK {
          connect_port 80
          connect_timeout 2
          nb_get_retry 2
          delay_before_retry 3
        }
    }

}

修改备用节点192.168.197.129上的配置文件。

vi /etc/keepalived/keepalived.conf

将以下内容复制内文件中(请根据实际情况调整配置文件参数)。

! Configuration File for keepalived

global_defs {
   router_id LVS_129
   lvs_flush 0
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 41
    priority 50
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.197.120
    }

    # Allow packets addressed to the VIPs above to be received
    accept
}

# 配置集群访问的地址
virtual_server 192.168.197.120 80 {
    # 健康检查时间,单位秒
    delay_loop 6
    # 配置负载均衡算法,默认轮询
    lb_algo wrr
    # 设置LVS的模式,NAT|TUN|DR
    lb_kind DR
    persistence_granularity src_ip+src_port
    # 设置会话持久化时间
    persistence_timeout 5
    # 协议类型
    protocol TCP

    real_server 192.168.197.130 80 {
        weight 1
        TCP_CHECK {
	  connect_port 80
	  connect_timeout 2
	  nb_get_retry 2
	  delay_before_retry 3
        }
    }
    real_server 192.168.197.131 80 {
        weight 1
	TCP_CHECK {
          connect_port 80
          connect_timeout 2
          nb_get_retry 2
          delay_before_retry 3
        }
    }

}


6.8 启动与停止

systemctl start keepalived #启动Keepalived
systemctl stop keepalived #停止Keepalived
systemctl restart keepalived #重启Keepalived
systemctl stop firewalld && systemctl disable firewalld #关闭两台LVS服务器防火墙(生产环境建议配置安全组规则)

6.9 安装ipvsadm

yum -y install ipvsadm
ipvsadm -Ln #以数字格式列出当前IPVS负载均衡规则

在这里插入图片描述

ipvsadm -Lnc #查看通过IPVS负载均衡器转发的活跃连接和状态信息

如果发现客户端访问VIP始终转发到某一台Nginx服务器上,可以通过以下命令配置超时时间,并结合keepalived.conf配置文件中的 persistence_timeout参数来解决。

ipvsadm --set 5 5 5 #设置LVS的连接超时参数,单位秒
ipvsadm -Ln --timeout #查看当前IPVS负载均衡器中TCP/UDP连接的超时时间

七、验证

7.1 验证LVS高可用

启动主备Keepalived和两台Nginx服务,浏览器访问http://192.168.197.120,可以正常访问Nginx欢迎界面
在这里插入图片描述

停止主节点Keepalived,浏览器再次访问http://192.168.197.120,也可以正常访问Nginx欢迎界面 在这里插入图片描述
在备用节可以看到VIP已经绑定到了备用节点192.168.197.129上了在这里插入图片描述
再次启动主节点Keepalived,可以看到VIP又重新绑定到了主节点192.168.197.128上了
在这里插入图片描述
7.2 验证Nginx高可用
停止192.168.197.130Nginx服务,无论怎么刷新地址,浏览器始终访问的都是192.168.197.131上的Nginx服务
在这里插入图片描述
使用ipvsadm -Ln命令,发现192.168.197.130这个服务已经被踢掉了
在这里插入图片描述
当再次启动192.168.197.130Nginx服务,发现服务又上线了
在这里插入图片描述

八、总结

利用LVS进行高性能流量分发,结合Keepalived主备切换机制,确保虚拟IP(VIP)始终可用。LVS 负载均衡器通过修改MAC地址将请求转发至Nginx后端服务器,响应直返客户端,规避性能瓶颈;Keepalived监控节点状态并自动切换VIP,实现故障秒级恢复。该方案兼具高并发处理能力与服务零中断可靠性,适用于Web服务、API网关等需横向扩展和高可用的生产场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值