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端测试:

相关推荐
Alex_81D33 分钟前
Https流式输出一次输出一大段,一卡一卡的-解决方案
nginx·http·https
代码的余温4 小时前
ActiveMQ多消费者负载均衡优化指南
java·后端·负载均衡·activemq
一个小白5554 小时前
nginx 的反向代理 负载均衡 动静分离 重写
linux·运维·前端·nginx·centos·firefox
果子⌂4 小时前
Nginx核心服务
运维·nginx
运维成长记6 小时前
企业级调度器LVS TUN实践
lvs
2301_803297756 小时前
nginx网站服务
linux·运维·nginx
L汐15 小时前
05 部署Nginx反向代理
运维·nginx·github
曼汐 .19 小时前
企业网站架构部署与优化-Nginx核心功能
前端·nginx·架构
zy happy20 小时前
黑马点评前端Nginx启动失败问题解决记录
java·运维·前端·spring boot·nginx·spring