LVS+KeepAlived+Nginx实现企业级业务高可靠部署的实战教程

在当今社会,我们享受着便捷的IT服务,包括政务、通信、银行、交通、网购、旅游等。这些服务背后,是健壮安全的IT化架构提供支撑,在某个节点故障后,自动进行切换,保证业务的高可用。

当前,主流的高可用解决方案为:LVS(Linux Virtual Server)、Nginx、Keepalived的组合。LVS负责实现高效的负载均衡,将用户请求合理分发至Nginx服务器;Nginx服务器进行七层反向代理、动静态分离、SSL、缓存功能,处理更为复杂的业务逻辑;KeepAlived则承担LVS故障检测与主备切换、自动检测后端Nginx服务器健康状态(剔除和加入)。通过三者的配合,让整个服务处于安全稳定的状态。

本文则详细介绍LVS+KeepAlived+Nginx企业级部署实战,让我们一步步完成高可用IT架构的搭建。

【整体架构】

①LVS+Keepalived:2 台,做四层转发+ VIP高可用(DR模式)。

②Nginx:N+台,做七层反向代理、动静态分离、SSL、缓存,本文以2台Nginx为例。

③VIP:对外统一入口。对于单日百万级别访问量的业务,会有N套"LVS+KeepAlived+Nginx"架构,对应N个VIP地址。这些地址配置DNS服务器上,实现一个域名对应多个VIP,从而均衡业务流量。

|----------|------------|--------------|
| 角色 | 主机名 | IP |
| 虚拟 IP | VIP | 172.16.1.100 |
| LVS主 | lvs-master | 172.16.1.101 |
| LVS备 | lvs-bcakup | 172.16.1.102 |
| Nginx节点1 | nginx-01 | 172.16.1.200 |
| Nginx节点2 | nginx-02 | 172.16.1.201 |

【部署推荐】

LVS建议以物理机进行部署,避免虚机因为迁移而引发脑裂问题

Nginx服务器建议采用虚机形式部署,提升可横向扩展性和资源利用效率

【部署流程】

一、临时关闭所有服务器防火墙和selinux,后续建议开启防火墙并放通策略。

复制代码
# systemctl stop firewalld# systemctl disable firewalld# setenforce 0

二、LVS服务器上安装keepalive和LVS,执行命令:

复制代码
# yum install -y keepalived ipvsadm

三、加载IPVS内核模块,并永久生效配置

复制代码
modprobe ip_vsmodprobe ip_vs_rrmodprobe ip_vs_wrrmodprobe ip_vs_sh#永久让模块生效,需要写到对应配置文件。echo "ip_vs" >> /etc/modules-load.d/ipvs.confecho "ip_vs_rr" >> /etc/modules-load.d/ipvs.confecho "ip_vs_wrr" >> /etc/modules-load.d/ipvs.confecho "ip_vs_sh" >> /etc/modules-load.d/ipvs.conf

四、本文采用DR模式,首先在主LVS服务器上执行。其配置文件路径为:

/etc/keepalived/keepalived.conf,下图为keepalived部分配置文件的截图。

五、按照规划要求,修改keepalived.conf文件如下所示,下面本文详细介绍各个参数含义:

复制代码
global_defs {    router_id lvs_master  #配置其keepalived标识,同一集群名称不能重复,建议与hostname保持一致。}# 健康Nginx健康状态脚本vrrp_script check_nginx {    script "/etc/keepalived/check_nginx.sh" #执行检查的脚本    interval 2 #间隔2s    weight -60 #权重调整值(关键):脚本检测失败时,当前节点的优先级会减60    fall 2 #失败阈值:连续2次检测失败,判定为服务真的故障    rise 2 #恢复阈值:连续2次检测成功,判定为服务恢复正常}#VRRP高可用实例段 vrrp_instance VI_1vrrp_instance VI_1 {    state MASTER #指定其为主用    interface enp4s1 # 实际网卡名virtual_router_id 61 #设置VRRP ID,主备LVS的ID必须保持一致。priority 150 #设置优先级,数值越大越为主用advert_int 1 #VRRP心跳间隔,单位为秒#下面进行VRRP主备关系的鉴权信息,主备LVS密码不一致建立不了主备关系。      authentication {        auth_type PASS #主用,备用建立VRRP,需要鉴权        auth_pass Lvs_server2026! #一定不要用弱口令}#设置VIP地址,并绑定到网卡    virtual_ipaddress {        172.16.1.100/24 dev enp4s1 label enp4s1:0 #绑定到enp4s1并起别名enp4s1:0    }    track_script {        check_nginx    } }# LVS转发规则的核心配置virtual_server 172.16.1.100 80 { #设置LVS虚拟服务监听的端口    delay_loop 1 #LVS每隔多长时间检查后端真实服务器状态,单位为秒    lb_algo wrr #负载算法,常见为加权wrr,轮询rr,哈希sh    lb_kind DR #LVS工作模式,DR直接路由,还有其它NAT、TUN    persistence_timeout 0  #会话保持时间    protocol TCP #协议TCP    # Nginx 01真实服务配置    real_server 172.16.1.200 80 {        weight 1 #权重        TCP_CHECK {            connect_timeout 3 #TCP超时时间,单位秒            nb_get_retry 3  #重试次数            delay_before_retry 3 #重试间隔        }    }    # Nginx 02    real_server 172.16.1.201 80 {        weight 1        TCP_CHECK {            connect_timeout 3        }    }}# 如果需要用 HTTPS ,再加 443端口。配置含义与上相同。virtual_server 172.16.1.100 443 {    delay_loop 1    lb_algo wrr    lb_kind DR    persistence_timeout 0    protocol TCP    real_server 172.16.1.200 443 {        weight 1        TCP_CHECK {            connect_timeout 3        }    }    real_server 172.16.1.201 443 {        weight 1        TCP_CHECK {            connect_timeout 3        }    }}

六、备用LVS服务器与主用LVS服务器配置只有下面2处不同:

复制代码
state BACKUPpriority 100

七、两台LVS服务器上都需要放置检测脚本,检测脚本路径为:

复制代码
/etc/keepalived/check_nginx.sh

检测脚本内容为:

复制代码
#!/bin/bash# 脚本路径:/etc/keepalived/check_nginx.sh# 功能:适配Keepalived的vrrp_script,检测后端Nginx健康状态# 返回值规范:0=检测成功(有可用Nginx),非0=检测失败(全部Nginx不可用)# 配合vrrp_script的fall/rise参数,连续2次失败则触发优先级调整
# ==================== 配置参数(根据你的实际环境修改)====================# 后端Nginx服务器IP列表(空格分隔,填写你的2台Nginx IP)NGINX_SERVERS=("172.16.1.200" "172.16.1.201")# Nginx健康检查端口(默认80,如有改动请修改,如443)CHECK_PORT=80# 检测超时时间(秒,建议不超过interval的一半)TIMEOUT=1# ==================== 配置结束 ====================
# 初始化可用服务器计数AVAILABLE_COUNT=0
# 遍历检测每台Nginx服务器(端口连通性检测)for server in "${NGINX_SERVERS[@]}"; do    # 使用nc检测端口,timeout控制超时,>/dev/null屏蔽无关输出    if timeout ${TIMEOUT} nc -z -w1 ${server} ${CHECK_PORT} >/dev/null 2>&1; then        ((AVAILABLE_COUNT++))    fidone
# 根据可用数量返回结果(Keepalived核心判断依据)if [ ${AVAILABLE_COUNT} -gt 0 ]; then    # 至少1台Nginx可用:返回0(检测成功)    exit 0else    # 全部Nginx不可用:返回1(检测失败)    exit 1fi

并且赋予这个脚本执行权限:

复制代码
chmod +x /etc/keepalived/check_nginx.sh

七、启动KeepAlived服务,并且设置成开机自启

复制代码
systemctl start keepalivedsystemctl enable keepalivedsystemctl status keepalived

八、真实服务器的Nginx安装,可以参考之前文章《Nginx在企业级生产环境部署与最佳实践》

Nginx在企业级生产环境部署与最佳实践

九、LVS使用的DR模式,需要让Nginx响应VIP的请求,但是不ARP广播VIP。因此,在2台Nginx服务器上均需要进行配置。本文采用shell脚本实现。新建/usr/local/bin/lvs_nginx.sh文件,然后在文件中写入下述内容:

复制代码
#!/bin/bash# 检查是否为 root 用户执行if [ $UID -ne 0 ]; then    echo "错误:必须以 root 权限执行此脚本!"    exit 1fiVIP=172.16.1.100case "$1" instart)    # 配置 ARP 忽略/通告参数,避免 VIP 漂移    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce    # 配置 lo:0 别名接口(兼容 ifconfig/ip 两种命令)    if command -v ifconfig &>/dev/null; then        ifconfig lo:0 "$VIP" netmask 255.255.255.255 broadcast "$VIP" up        route add -host "$VIP" dev lo:0    else        ip addr add "$VIP/32" dev lo label lo:0        ip route add "$VIP/32" dev lo    fi    echo "LVS-DR 模式已启用"    ;;stop)    # 关闭 lo:0 别名接口    if command -v ifconfig &>/dev/null; then        ifconfig lo:0 down    else        ip addr del "$VIP/32" dev lo label lo:0        ip route del "$VIP/32" dev lo    fi
    # 恢复 ARP 参数默认值    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce    echo "LVS-DR 模式已关闭"    ;;*)    echo "Usage: $0 {start|stop}"    exit 1    ;;esac

十、给脚本设置执行权限,并且将启动脚本写到开机自启文件中

复制代码
chmod +x /usr/local/bin/lvs_nginx.sh/usr/local/bin/lvs_nginx.sh startecho "/usr/local/bin/lvs_nginx.sh" start >> /etc/rc.localchmod +x /etc/rc.local

十一、给Nginx修改首页界面。这里,我们分别给nginx-01和nginx-02修改主界面。

复制代码
echo "nginx-01" >/usr/share/nginx/html/index.htmlecho "nginx-02" >/usr/share/nginx/html/index.html

如果想测试验证Nginx的高级特性,动静分离和反向代理,可以参考之前的文章《Nginx在企业级生产环境部署与最佳实践》

Nginx在企业级生产环境部署与最佳实践

十二、这里我们分别测试停止LVS,查看业务状态。这时,请求VIP业务不受影响。请求界面在nginx-01和nginx-02不断切换。

十三、在这个时候,我们再停掉其中一个Nginx,这时LVS只将请求打给另外一台Nginx,LVS会自动剔除关掉的那个节点。

【LVS+Nginx+KeepAlived常见的运维命令】

查看 LVS 连接

ipvsadm -ln

查看状态统计

ipvsadm -l --stats

清空规则

ipvsadm -C

日志跟踪

journalctl -u keepalived -f

查看 VIP 所在机器

ip addr | grep 172.16.1.100

相关推荐
张文君3 小时前
docker使用代理拉取镜像
运维·docker·容器
Ai拆代码的曹操4 小时前
Nginx upstream keepalive 连接池中毒排查实录
chrome·nginx·php
陌路204 小时前
Docker教程从入门到精通(0基础)
运维·docker·容器
Tongzhi20264 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
数据知道4 小时前
宽字节注入、二次注入、堆叠注入:高级 SQLi 专题
linux·运维·安全·网络安全
2301_780789665 小时前
DDoS 攻击溯源:DNS 水印标记 + 区块链存证的双保险
运维·服务器·网络·云原生·ddos
童槿顏丶6 小时前
GitLab部署到Linux
linux·运维·gitlab
小柒儿3368 小时前
从单Agent到多智能体系统:多智能体协作重塑自动化边界
运维·自动化
QYR-分析9 小时前
注塑机机械手自动化装备行业发展研判:存量升级催生增量红利,2032 年市场规模逼近 9 亿美元
运维·自动化