一文搞懂 Nginx、Haproxy、Keepalived 的区别与配合
前言
在构建高可用的服务架构时,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 工作流程
-
Master 节点持有 VIP,定期发送 VRRP 通告。
-
Backup 节点监听通告,若超时未收到,则认为 Master 故障,抢占 VIP。
-
新 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 替代方案),也欢迎留言交流。
更多推荐

所有评论(0)