前言

在构建高可用的服务架构时,Nginx、Haproxy、Keepalived 是三个绕不开的组件。很多初学者容易混淆它们的职责:Nginx 和 Haproxy 都能做负载均衡,Keepalived 又能漂移 IP,它们到底如何分工?如何配合?

本文结合我在实习和项目中的实践,帮你彻底理清这三个“兄弟”的关系。

一、Nginx:七层反向代理专家

1.1 定位

  • 高性能的 Web 服务器 + 反向代理服务器 + 七层负载均衡器

1.2 核心能力

  • 反向代理:接收客户端请求,转发给后端服务,隐藏后端细节。

  • 七层路由:可根据域名、URL 路径、请求头等灵活分发流量。

  • 静态资源服务:直接返回图片、CSS、JS 等文件。

  • SSL 终结:集中管理 HTTPS 证书。

  • 负载均衡算法:轮询、加权轮询、IP Hash、最少连接等。

1.3 健康检查

  • 开源版主要支持 被动健康检查:通过请求失败次数标记后端为 down

  • 主动健康检查需要 Nginx Plus 或第三方模块。

1.4 适用场景

  • 作为 流量入口,根据域名将请求分发到不同网关或后端。

  • K8s 中的 Ingress Controller(如 ingress-nginx)。

  • 前后端分离项目的静态资源 + API 代理。

二、Haproxy:四层/七层负载均衡高手

2.1 定位

  • 高性能的 TCP/HTTP 负载均衡器,尤其擅长 四层(传输层)代理

2.2 核心能力

  • 四层负载均衡:基于 IP + 端口转发,适用于 MySQL、Redis、Elasticsearch、Kafka 等任何 TCP 协议的服务。

  • 七层负载均衡:支持 HTTP 请求解析,可基于 URL、Header 做路由。

  • 丰富的主动健康检查:支持 TCP 连接检测、HTTP 状态码检测、发送自定义数据并匹配响应。

  • 动态配置:通过运行时 API 可修改 upstream 列表,无需重启。

2.3 与 Nginx 的对比

特性 Nginx Haproxy
四层(TCP)代理 支持(stream模块) 原生且更高效
七层(HTTP)代理 强大,配置灵活 也支持,但偏传统
主动健康检查 需商业版或第三方模块 原生非常丰富
动态更新 upstream Nginx Plus 支持 原生支持(socket/API)
典型场景 HTTP 入口、静态服务 中间件高可用接入

2.4 适用场景

  • 中间件高可用接入:为 Elasticsearch、etcd、Kafka、MySQL 等提供统一的 VIP 入口和故障节点自动剔除。

  • 数据库读写分离代理。

三、Keepalived:VIP 高可用守护者

3.1 定位

  • 通过 VRRP(虚拟路由冗余协议) 实现 VIP(虚拟 IP) 在多台服务器之间漂移,提供负载均衡器自身的高可用。

3.2 核心能力

  • VRRP 协议实现:多台机器组成一个虚拟路由器,Master 持有 VIP,Backup 监听 Master 状态。

  • 健康检查:定期检测本机上的服务(如 Haproxy、Nginx)是否存活。

  • 通知脚本:角色切换时执行自定义操作(如发送告警)。

3.3 常见误解

  • Keepalived 只监控本机的负载均衡器进程(如 Haproxy),不监控后端真实节点(如 etcd 节点)。

  • 后端节点的健康检查和故障剔除由 Haproxy 或 Nginx 自己完成。

3.4 工作流程

  1. Master 节点持有 VIP,定期发送 VRRP 通告。

  2. Backup 节点监听通告,若超时未收到,则认为 Master 故障,抢占 VIP。

  3. 新 Master 发送 gratuitous ARP,更新网络设备 MAC 表,流量自动切过来。

四、三者如何配合?—— 典型高可用架构

4.1 整体链路

text

                     ┌─────────────────┐
                     │   域名/DNS       │
                     └────────┬────────┘
                              │
                              ▼
                    ┌─────────────────┐
                    │   Keepalived VIP │  ← 保证入口高可用
                    └────────┬────────┘
                              │
              ┌───────────────┼───────────────┐
              │               │               │
              ▼               ▼               ▼
        ┌──────────┐   ┌──────────┐   ┌──────────┐
        │ Nginx 节点1│   │ Nginx 节点2│   │ Nginx 节点3│  ← 七层入口
        └────┬─────┘   └────┬─────┘   └────┬─────┘
              └───────────────┼───────────────┘
                              │
                              ▼
                    ┌─────────────────┐
                    │   APISIX 网关    │  ← 路由、限流等
                    └────────┬────────┘
                              │
                              ▼
                    ┌─────────────────┐
                    │   后端微服务     │
                    └─────────────────┘

         另外一套高可用中间件接入(四层):
                    ┌─────────────────┐
                    │  Keepalived VIP  │
                    └────────┬────────┘
                              │
              ┌───────────────┼───────────────┐
              │               │               │
              ▼               ▼               ▼
        ┌──────────┐   ┌──────────┐   ┌──────────┐
        │ Haproxy 1 │   │ Haproxy 2 │   │ Haproxy 3 │  ← 四层代理
        └────┬─────┘   └────┬─────┘   └────┬─────┘
              └───────────────┼───────────────┘
                              │
                ┌─────────────┼─────────────┐
                │             │             │
                ▼             ▼             ▼
           ES节点1        ES节点2        ES节点3   ← 后端中间件

4.2 各层职责

层级 组件 职责
入口高可用 Keepalived 为 Nginx 集群提供 VIP,保证至少一个 Nginx 存活
七层入口 Nginx 根据域名/URL 将流量转发到 APISIX 网关,被动健康检查
路由/网关 APISIX 精细化路由、认证、限流
中间件接入高可用 Keepalived 为 Haproxy 集群提供 VIP
四层代理 Haproxy 对 ES/etcd/Kafka 等 TCP 服务做负载均衡,主动健康检查并剔除故障节点
后端 中间件节点 提供实际数据服务

五、常见面试追问与解答

Q1:Keepalived 会监控后端真实节点吗?

A:通常不会。Keepalived 只监控本机负载均衡器进程(如 Haproxy)是否存活,以此决定是否漂移 VIP。后端节点的健康检查由 Haproxy 或 Nginx 自身完成,各司其职。

Q2:Nginx 和 Haproxy 的健康检查有什么不同?

A:开源 Nginx 主要支持被动检查(请求失败才标记 down);主动检查需商业版或第三方模块。Haproxy 原生支持非常灵活的主动检查(TCP 连接、HTTP 状态码、自定义数据响应匹配)。

Q3:为什么中间件接入场景更推荐 Haproxy 而不是 Nginx?

A:中间件多为 TCP 协议,Haproxy 的四层代理性能优异,配置简洁,且主动健康检查强大,可以针对不同中间件定制探测逻辑(如发送 stats 命令到 Redis)。Nginx 的 stream 模块也可以做,但配置稍复杂。

Q4:Nginx 前面可以不加 Keepalived 吗?

A:可以。如果 Nginx 集群前面有硬件负载均衡器(如 F5)或 DNS 轮询 + 健康检查,就不需要 Keepalived。但对于自建高可用场景,Keepalived 是轻量高效的方案。

六、总结

组件 核心职责 健康检查 典型场景
Nginx 七层反向代理、HTTP 入口 被动为主 Web 入口、静态服务、API 网关前置
Haproxy 四层/七层负载均衡,尤其适合 TCP 主动丰富 中间件高可用接入(ES、etcd、Kafka)
Keepalived VIP 漂移,保证负载均衡器高可用 只检查本机服务 为 Nginx 或 Haproxy 提供主备切换

一句话总结:

Haproxy 负责后端节点负载均衡和故障剔除,Keepalived 保证负载均衡器自身高可用,Nginx 负责七层入口路由。

希望这篇文章能帮你理清这三个组件的分工与合作。如果你在生产环境中有更复杂的架构(比如 LVS + Keepalived,或者 Envoy 替代方案),也欢迎留言交流。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐