LVS + Keepalived + Nginx 高可用负载均衡系统实验

1. 项目背景

在现代 Web 应用中,高可用性和负载均衡是至关重要的需求。本项目旨在通过 LVS(Linux Virtual Server)实现流量分发,通过 Keepalived 实现高可用性,通过 Nginx 提供后端服务。该架构能够确保在单点故障的情况下,系统仍然能够正常运行,并且能够均衡地分配流量到多个后端服务器。

2. 环境准备

2.1 服务器角色及 IP 规划
服务器角色 操作系统 内网 IP (ens160) VIP 安装软件
LVS 主节点 CentOS 7 192.168.65.131 192.168.65.100 (lvs-ens160) 192.168.65.101(keepalived-ens160) ipvsadm, Keepalived
LVS 备节点 CentOS 7 192.168.65.132 192.168.65.100 (lvs-ens160) 192.168.65.101(keealived-ens160) ipvsadm, Keepalived
后端 Web 服务器 1 CentOS 7 192.168.65.133 192.168.65.100 (lvs-lo) Nginx
后端 Web 服务器 2 CentOS 7 192.168.65.134 192.168.65.100 (lvs-lo) Nginx
2.2 实验前准备
  1. 关闭 SELinux,以避免对实验造成干扰。

    复制代码
    sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    sudo reboot
  2. 开启防火墙并放行必要的端口,确保负载均衡和高可用性功能正常工作。

3. 服务器网络环境配置

3.1 设置静态 IP 地址

为确保服务器在重启后仍能保持固定的网络配置,使用 nmcli 设置静态 IP 地址。

LVS 主节点(192.168.65.131)
  1. 查看当前网络连接名称

    复制代码
    nmcli con show

    网络接口名称为 ens160

  2. 修改静态 IP 地址

    复制代码
    nmcli con mod ens160 ipv4.addresses 192.168.65.131/24 ipv4.gateway 192.168.65.2 ipv4.dns 8.8.8.8 ipv4.method manual
  3. 重新加载网络配置并重启网络服务

    复制代码
    nmcli con up ens160
LVS 备节点(192.168.65.132)
  1. 查看当前网络连接名称

    复制代码
    nmcli con show

    网络接口名称为 ens160

  2. 修改静态 IP 地址

    复制代码
    nmcli con mod ens160 ipv4.addresses 192.168.65.132/24 ipv4.gateway 192.168.65.2 ipv4.dns 8.8.8.8 ipv4.method manual
  3. 重新加载网络配置并重启网络服务

    复制代码
    nmcli con up ens160
后端 Web 服务器 1(192.168.65.133)
  1. 查看当前网络连接名称

    复制代码
    nmcli con show

    假设网络接口名称为 ens160

  2. 修改静态 IP 地址

    复制代码
    nmcli con mod ens160 ipv4.addresses 192.168.65.133/24 ipv4.gateway 192.168.65.2 ipv4.dns 8.8.8.8 ipv4.method manual
  3. 重新加载网络配置并重启网络服务

    复制代码
    nmcli con up ens160
后端 Web 服务器 2(192.168.65.134)
  1. 查看当前网络连接名称

    复制代码
    nmcli con show

    网络接口名称为 ens160

  2. 修改静态 IP 地址

    复制代码
    nmcli con mod ens160 ipv4.addresses 192.168.65.134/24 ipv4.gateway 192.168.65.2 ipv4.dns 8.8.8.8 ipv4.method manual
  3. 重新加载网络配置并重启网络服务

    复制代码
    nmcli con up ens160
3.2 配置主机名和主机映射

为便于在集群环境中快速识别和管理各服务器,需要为每台服务器配置主机名。

LVS 主节点(192.168.65.131)
  1. 设置主机名

    复制代码
    sudo hostnamectl set-hostname lvs-master
  2. 更新 /etc/hosts 文件

    复制代码
    sudo vi /etc/hosts

    添加以下内容:

    复制代码
    127.0.0.1   lvs-master
    192.168.65.131 lvs-master
    192.168.65.132 lvs-backup
    192.168.65.133 webserver1
    192.168.65.134 webserver2
LVS 备节点(192.168.65.132)
  1. 设置主机名

    复制代码
    sudo hostnamectl set-hostname lvs-backup
  2. 更新 /etc/hosts 文件

    复制代码
    sudo vi /etc/hosts

    添加以下内容:

    复制代码
    127.0.0.1   lvs-backup
    192.168.65.131 lvs-master
    192.168.65.132 lvs-backup
    192.168.65.133 webserver1
    192.168.65.134 webserver2
后端 Web 服务器 1(192.168.65.133)
  1. 设置主机名

    复制代码
    sudo hostnamectl set-hostname webserver1
  2. 更新 /etc/hosts 文件

    复制代码
    sudo vi /etc/hosts

    添加以下内容:

    复制代码
    127.0.0.1   webserver1
    192.168.65.131 lvs-master
    192.168.65.132 lvs-backup
    192.168.65.133 webserver1
    192.168.65.134 webserver2
后端 Web 服务器 2(192.168.65.134)
  1. 设置主机名

    复制代码
    sudo hostnamectl set-hostname webserver2
  2. 更新 /etc/hosts 文件

    复制代码
    sudo vi /etc/hosts

    添加以下内容:

    复制代码
    127.0.0.1   webserver2
    192.168.65.131 lvs-master
    192.168.65.132 lvs-backup
    192.168.65.133 webserver1
    192.168.65.134 webserver2
3.3 配置防火墙规则

为保障网络安全,需要优化防火墙规则,开启必要的服务端口,同时关闭不必要的端口。使用 firewalld 配置防火墙:

  1. 开启 HTTP(80 端口)和 VRRP(112 端口)

    复制代码
    firewall-cmd --zone=public --add-port=80/tcp --permanent
    firewall-cmd --zone=public --add-port=112/udp --permanent
    firewall-cmd --reload
  2. 验证防火墙规则

    复制代码
    firewall-cmd --list-all

    确保 80/tcp112/udp 端口已正确放行。

3.4 实现 SSH 免密登录

为提高运维效率并减少人为错误,需要实现 SSH 免密登录。生成 SSH 密钥对,并将公钥复制到所有服务器:

复制代码
ssh-keygen -t rsa
ssh-copy-id lvs-backup
ssh-copy-id webserver1
ssh-copy-id webserver2

4. 软件安装与配置

4.1 LVS 主节点和备节点配置
4.1.1 安装 IPVS 和 Keepalived

在 LVS 主节点和备节点上安装必要的软件:

复制代码
yum install -y ipvsadm keepalived
4.1.2 加载 IPVS 模块
复制代码
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh

确保模块加载成功:

复制代码
lsmod | grep ip_vs
4.1.3 配置 IP 转发

编辑 /etc/sysctl.conf 文件,添加或修改以下内容:

复制代码
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens160.send_redirects = 0

使配置生效:

复制代码
sysctl -p
4.1.4 配置 VIP

在主节点上配置 VIP:

复制代码
sudo nmcli con mod ens160 +ipv4.addresses 192.168.65.100/32
sudo nmcli con up ens160
4.1.5 配置 LVS 规则
  1. 清除原有 LVS 规则

    复制代码
    ipvsadm -C
  2. 添加虚拟服务器

    复制代码
    ipvsadm -A -t 192.168.65.100:80 -s rr
  3. 添加真实服务器

    复制代码
    ipvsadm -a -t 192.168.65.100:80 -r 192.168.65.133:80 -g -w 1
    ipvsadm -a -t 192.168.65.100:80 -r 192.168.65.134:80 -g -w 1
  4. 查看lvs规则

    复制代码
    ipvsadm -Ln
  5. 保存 LVS 规则

    复制代码
    ipvsadm -S > /etc/sysconfig/ipvsadm
4.1.6 配置 Keepalived

编辑 /etc/keepalived/keepalived.conf 文件,配置 Keepalived 以实现主备切换,确保高可用性:

主节点(192.168.65.131)

复制代码
global_defs {
     router_id LVS_MASTER
}
vrrp_instance VI_1 {
      state MASTER
      interface ens160
      virtual_router_id 51
      priority 100
      advert_int 1
      authentication {
          auth_type PASS
          auth_pass 1234
      }
      virtual_ipaddress {
          192.168.65.101
      }
}

备节点(192.168.65.132)

复制代码
global_defs {
     router_id LVS_BACKUP
}
vrrp_instance VI_1 {
      state BACKUP
      interface ens160
      virtual_router_id 51
      priority 90
      advert_int 1
      authentication {
          auth_type PASS
          auth_pass 1234
      }
      virtual_ipaddress {
          192.168.65.101
      }
}
4.1.7 启动服务

启动并启用 IPVS 和 Keepalived 服务,确保配置生效:

复制代码
sudo systemctl enable keepalived
sudo systemctl start keepalived

主节点获取keepalived-vip(192.168.65.101),备用节点未争取到

4.2 后端 Web 服务器配置
4.2.1 安装 Nginx

在后端 Web 服务器上安装 Nginx,为用户提供 Web 服务:

复制代码
sudo yum install -y nginx
4.2.2 启动 Nginx 并设置开机自启
复制代码
sudo systemctl start nginx
sudo systemctl enable nginx
4.2.3 修改 Nginx 默认页面(用于区分不同服务器)

Web 服务器 1(192.168.65.133)

复制代码
echo "<h1>This is Real Server 1</h1>" > /usr/share/nginx/html/index.html

Web 服务器 2(192.168.65.134)

复制代码
echo "<h1>This is Real Server 2</h1>" > /usr/share/nginx/html/index.html
4.2.4 配置 VIP

在真实服务器上配置 VIP:

复制代码
sudo nmcli con add type loopback con-name lo ifname lo +ip4 192.168.65.100/32
sudo nmcli con up lo
4.2.5 调整 ARP 参数

编辑 /etc/sysctl.conf 文件,添加以下内容:

复制代码
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2

使配置生效:

复制代码
sysctl -p
5. 测试与验证
5.1 验证 LVS 和 Keepalived
5.1.1 正常访问测试

验证客户端是否能够通过虚拟 IP 正常访问后端服务器:

复制代码
curl 192.168.65.100

预期结果 :返回 This is Real Server 1This is Real Server 2

5.1.2 主节点故障模拟

验证在主节点故障时,备节点是否能够正常接管虚拟 IP:

在主节点(192.168.65.131)上停止 Keepalived 服

复制代码
systemctl stop keepalived

主节点失去vip

备用节点获取vip

5.2 验证 Nginx

验证后端服务器的 Nginx 服务是否正常运行:

复制代码
curl http://192.168.65.133
curl http://192.168.65.134

预期结果 :分别返回 This is Real Server 1This is Real Server 2

用客户机和windows端测试:

相关推荐
比特森林探险记40 分钟前
Nginx+Lua动态加载黑名单
nginx·junit·lua
惘嘫、冋渞1 天前
CentOS 7 下 Nginx 编译后热重启方案
chrome·nginx·centos
码农-小林1 天前
使用leaflet库加载服务器离线地图瓦片(这边以本地nginx服务器为例)
运维·服务器·nginx
阑梦清川1 天前
docker入门教程--部署nginx和tomcat
nginx·docker·tomcat
fruge2 天前
Ubuntu服务器已下载Nginx安装包的安装指南
服务器·nginx·ubuntu
siriuuus2 天前
Linux Tomcat 简单使用及 Nginx 反向代理
linux·nginx·tomcat
xrkhy2 天前
微服务之hystrix熔断降级和负载均衡
hystrix·微服务·负载均衡
li3714908902 天前
nginx报400bad request 请求头过大异常处理
java·运维·nginx
Crazy________2 天前
34部署LNMP架构详细解析
linux·运维·服务器·nginx
洛克大航海2 天前
3-SpringCloud-LoadBalancer-OpenFeign服务调用与负载均衡
spring·spring cloud·负载均衡·openfeign·loadbalancer