nginx与keepalived协同实现微服务网关高可用:nginx负责七层路由、鉴权等业务逻辑,keepalived通过vip漂移实现秒级故障接管;需统一nginx配置、启用健康检查脚本、确保vip同网段可达,并验证切换时业务无感连续。

用 Nginx 和 Keepalived 搭建微服务网关集群,核心目标是让网关服务具备故障自动切换能力,避免单点失效导致整个微服务入口中断。这不是简单把两个软件装上就行,关键在角色分工与协同机制:Nginx 负责七层路由、鉴权、限流等网关逻辑;Keepalived 不处理业务流量,只管“谁该对外提供服务”——通过 VIP(虚拟 IP)漂移实现秒级接管。
网关节点需统一配置 Nginx
所有节点的 Nginx 必须提供完全一致的网关功能:
- 反向代理规则、JWT 验证、路径重写、熔断配置等全部写入
/etc/nginx/conf.d/gateway.conf,且两台机器文件内容逐字节相同 - 后端服务地址统一指向注册中心(如 Nacos 或 Eureka),不硬编码具体实例 IP,确保上游变更对网关透明
- 启用
keepalive_timeout和连接池复用,降低频繁建连开销;建议关闭 access_log 或异步写入,减少磁盘 I/O 压力
Keepalived 配置要聚焦健康检查
仅靠 VRRP 心跳不够,必须叠加主动探活,否则 Nginx 进程卡死但系统仍存活,VIP 不会漂移:
- 在
keepalived.conf中定义自定义检测脚本,例如每 2 秒请求http://127.0.0.1:80/health,返回非 200 则降权 - 主节点优先级设为 100,备节点设为 90;脚本检测失败时,主节点 priority 减 20,低于备节点即触发切换
-
virtual_router_id必须全局唯一且同网段内不冲突;interface明确指定物理网卡名(如 ens33),避免绑定错设备
VIP 必须满足网络可达性
虚拟 IP 是客户端访问的唯一入口,它的可用性直接决定集群是否真正高可用:
- VIP 必须与真实服务器 IP 在同一二层网络(同 VLAN / 同交换机广播域),Keepalived 依赖组播通信,跨子网会失效
- VIP 不能被其他设备占用,部署前用
arping -c 2 -I ens33 10.3.145.112确认无响应 - 客户端 DNS 或负载均衡器应解析到 VIP,而非某台具体机器 IP;若用域名,TTL 建议设为 30 秒以内,便于快速生效
切换过程要验证服务连续性
完成配置后,不能只看 VIP 是否飘过去,得验证业务层面是否无感:
- 模拟主节点宕机:执行
systemctl stop nginx,观察备节点日志中是否出现"VRRP_Instance(VI_1) Entering MASTER STATE" - 用 curl 持续请求 VIP 地址(如
while true; do curl -s -o /dev/null -w "%{http_code}\n" http://10.3.145.112/api/test; sleep 0.5; done),确认 HTTP 状态码始终为 200,无 502 或超时 - 检查新主节点的 Nginx error.log,确认无 upstream connect timeout 或 resolver 失败等异常











