nginx+keepalived集群实现https高可用的关键在于nginx的ssl配置健壮性、证书统一部署与主动健康检查:所有节点需部署相同证书私钥,启用tlsv1.2/1.3及aead加密套件,并通过keepalived调用openssl脚本验证ssl握手有效性,确保vip仅漂移到真正可提供https服务的节点。

要让 Nginx + Keepalived 集群真正支持 SSL(即 HTTPS 流量的高可用与安全分发),关键不在 Keepalived,而在于 Nginx 的 HTTPS 配置是否健壮、证书管理是否统一、VIP 漂移后连接是否平滑——Keepalived 只负责把虚拟 IP(VIP)可靠地绑定到健康节点上,真正的 TLS 终止、SNI 路由、会话复用等全由 Nginx 承担。
SSL 终止必须放在 Nginx 层
Keepalived 不处理任何应用层协议,它只管 VIP 归属和主机存活。所以 SSL 加解密、证书验证、HTTP/2 协商、OCSP Stapling 等全部落在 Nginx 上。这意味着:
- 所有节点必须部署**完全相同的证书与私钥**(建议存于 /etc/nginx/ssl/,权限设为 600)
- Nginx 配置中需启用 ssl_certificate 和 ssl_certificate_key,并推荐开启 ssl_trusted_certificate 用于 OCSP
- 使用 ssl_protocols TLSv1.2 TLSv1.3 明确限定协议版本,禁用不安全旧协议
- 配置 ssl_ciphers 时优先选用 AEAD 类型套件(如 ECDHE-ECDSA-AES256-GCM-SHA384),避免 RC4、CBC 类易受攻击组合
Keepalived 需配合 Nginx 健康检查防“假活”
仅靠 Keepalived 默认的 VRRP 心跳不能反映 Nginx 是否真能处理 HTTPS 请求。若 Nginx 进程在、端口也通,但 SSL 握手失败或证书过期,用户仍会遭遇 ERR_SSL_PROTOCOL_ERROR。因此必须加一层主动检测:
- 编写检查脚本(如 /etc/keepalived/check_nginx_ssl.sh),用 openssl s_client -connect 127.0.0.1:443 -servername example.com -verify_return_error 验证握手与证书链有效性
- 在 keepalived.conf 中定义 vrrp_script,调用该脚本,interval 3 秒执行一次,fall 3 rise 2
- 将该 script 加入 track_script,确保 VIP 只漂移到真正可提供有效 HTTPS 服务的节点
双节点部署时注意证书热更新与无缝 reload
证书快过期时,不能停服务更新。Nginx 支持热重载(nginx -s reload),但需确保:
- 新证书写入后,先用 nginx -t 校验语法与文件可读性,避免 reload 失败导致整个节点退出
- Keepalived 的 notify 钩子可配置 reload 动作(例如在 notify_backup / notify_master 中触发),但更稳妥的做法是:人工更新证书 → 手动 reload → 观察 access.log 与 $ssl_protocol 字段确认新连接已走 TLSv1.3
- 若用 Let’s Encrypt,推荐 certbot --deploy-hook "nginx -s reload" 自动化,且确保两节点共用同一 ACME 账户与域名验证方式(如 DNS-01)
进阶:支持多域名 SNI 与不同证书路由
单个 VIP 对应多个 HTTPS 域名(如 api.example.com + www.example.com)时,Nginx 依靠 SNI 区分证书。配置要点:
- 每个 server 块必须有独立的 server_name 和匹配的 ssl_certificate 路径
- 避免在 default_server 上硬编码证书;未匹配 SNI 的请求应返回 421 或重定向,而非默认证书报错
- Keepalived 不感知 SNI,所以 VIP 下所有域名天然共享同一高可用入口,无需额外配置











