在当今社会,我们享受着便捷的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在企业级生产环境部署与最佳实践》
九、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在企业级生产环境部署与最佳实践》
十二、这里我们分别测试停止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