引言
在单节点部署的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 Server1 | 192.168.197.130 | 运行Nginx |
Nginx Real Server2 | 192.168.197.131 | 运行Nginx |
LVS Director Master | 192.168.197.128 | 运行Keepalived + LVS |
LVS Director BackUP | 192.168.197.129 | 运行Keepalived + LVS |
VIP | 192.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内核
将vrrp.c文件2717行替换成如下内容,并重新编译安装vi /usr/local/keepalived-2.3.3/keepalived/vrrp/vrrp.c
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网关等需横向扩展和高可用的生产场景。