nginx负责七层流量转发与负载均衡,keepalived通过vrrp协议保障vip高可用;需明确主备或双主架构,确保nginx配置一致,配置健康检查脚本并动态调整优先级,正确设置arp参数及放行vrrp组播。

用 Nginx 和 Keepalived 搭建分布式反向代理集群,核心目标是解决单点故障、提升入口层的可用性与伸缩性。这不是简单装两个软件就能跑起来的事,关键在于角色分工清晰:Nginx 负责七层流量转发(如按域名、路径、Header 分发)、负载均衡和缓存;Keepalived 不直接处理请求,而是通过 VRRP 协议保障 VIP(虚拟 IP)高可用——让客户端始终访问同一个 IP,背后自动切换健康的 Nginx 节点。
明确主备或双主架构选型
主备模型适合中小规模场景,部署简单、逻辑清晰;双主模型可提升资源利用率,但需注意会话一致性与 DNS 缓存问题。
- 主备模式下,一台 Nginx 作为 MASTER 承担全部流量,另一台 BACKUP 处于待命状态,仅当 MASTER 心跳丢失时接管 VIP
- 双主模式需配置多个 VRRP 实例(如 VI_1 和 VI_2),分别绑定不同 VIP,并在两节点上互为 MASTER/BACKUP,实现流量分摊
- 无论哪种模式,都必须确保两节点的 Nginx 配置完全一致(包括 upstream、proxy_set_header、超时参数等),否则切换后行为可能异常
Nginx 反向代理配置要兼顾健壮与可观测
反向代理不只是写个 upstream 就完事,得考虑失败重试、健康感知、请求透传和日志溯源。
- upstream 块中建议启用 max_fails=3 fail_timeout=30s,配合 keepalive 连接复用,避免后端瞬断引发雪崩
- 务必设置 proxy_set_header X-Real-IP $remote_addr 和 X-Forwarded-For,保证后端服务能获取真实客户端 IP
- 添加 proxy_next_upstream error timeout http_500 http_502 http_503 http_504,允许在上游异常时自动转发到下一个节点
- 启用 access_log 的 upstream_addr 字段,便于定位具体哪台后端机器响应了请求
Keepalived 必须做主动健康检查
默认的 VRRP 心跳只检测网络连通性,无法发现 Nginx 进程僵死或配置加载失败。必须补充自定义脚本监控关键指标。
- 编写检测脚本(如 check_nginx.sh),用 curl -I http://127.0.0.1/healthz -s -o /dev/null -w "%{http_code}" | grep "200" 验证 Nginx 是否正常响应
- 在 keepalived.conf 的 vrrp_script 区块中调用该脚本,并设置 weight 变化值(如 +20/-20),使优先级动态调整
- 确保 script 执行权限正确(chmod +x),且脚本路径在所有节点一致;建议加日志输出便于排障
- 注意 vrrp_instance 中的 track_script 必须引用该脚本名,且 priority 差值应大于 weight 变化幅度,防止抖动
VIP 和网络层细节不能忽略
VIP 是整个高可用的“门面”,它的生效依赖底层网络支持,常见坑点集中在 ARP 和路由层面。
- VIP 必须和节点物理网卡在同一子网,且不能与任何已有 IP 冲突;推荐使用 /32 掩码(如 192.168.10.200/32)避免广播干扰
- Linux 默认禁用非本地 IP 的 ARP 响应,需在 sysctl.conf 中开启:net.ipv4.conf.all.arp_ignore = 1 和 net.ipv4.conf.all.arp_announce = 2
- 防火墙需放行 VRRP 组播地址 224.0.0.18(协议号 112),否则心跳包收不到,导致脑裂
- 若用云厂商环境(如阿里云、腾讯云),多数不支持组播,需改用单播模式(unicast_peer),并手动指定对端 IP











