Nginx做SSL卸载网关+Keepalived双机热备可消除单点故障,核心是VIP由Keepalived管理、SSL终止由Nginx完成、健康检查必须验证TLS握手而非仅端口通断。

用 Nginx 做 SSL 卸载网关,再配 Keepalived 实现双机热备,就能消除单点故障——关键不在“装两个”,而在“主备能自动切换且不中断 HTTPS 流量”。核心是:SSL 终止由 Nginx 完成,VIP(虚拟 IP)由 Keepalived 管理,健康检查必须覆盖 SSL 服务本身,而非仅端口通断。
SSL 卸载网关的 Nginx 配置要点
Nginx 不仅要转发请求,更要可靠地处理 TLS 握手和证书。配置需明确:
- 监听 443 端口并启用 ssl,禁用不安全协议(如 SSLv3、TLSv1.0)
- 使用完整证书链(
ssl_certificate包含域名证书 + 中间 CA),避免客户端校验失败 - 开启
ssl_session_cache shared:SSL:10m和ssl_session_timeout 4h提升复用效率 - 后端代理保持 HTTP/HTTPS 清晰分离,例如用
proxy_pass http://backend_pool;,不透传原始 TLS - 添加
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;强制 HSTS
Keepalived 必须绑定 SSL 健康检查
只检测 Nginx 进程或 80 端口是无效的——SSL 卸载失败时,Nginx 可能仍在运行、HTTP 也通,但 HTTPS 已不可用。必须检查真实 TLS 握手:
- 写一个轻量检查脚本(如
/etc/keepalived/nginx_ssl_check.sh),用timeout 3 openssl s_client -connect 127.0.0.1:443 -servername example.com 2>/dev/null | grep "Verify return code: 0" - 在
keepalived.conf中定义vrrp_script调用该脚本,设置interval 3、fall 2、rise 2 - 将该 script 关联到
vrrp_instance的track_script,确保 VIP 仅在 HTTPS 真正可用时才归属本机
主备节点配置差异与一致性控制
两台机器的配置不是“镜像复制”就完事,需主动区分角色又保持语义一致:
-
state字段严格区分:MASTER 和 BACKUP,不可都设为 MASTER -
priority主机设为 100,备机设为 90(差值 ≥ 10,防抖动) -
virtual_router_id、auth_pass、virtual_ipaddress三者必须完全一致,否则 VRRP 组无法建立 - 网卡名(
interface)按实际填写(如ens192或eth0),不能照抄示例 - 建议关闭
preempt_delay或设为 0,避免主恢复后立即抢 VIP 导致 TLS 会话中断
验证与上线前必做动作
上线前不验证 = 生产事故预备役:
- 手动停掉主节点 Nginx,确认 3–5 秒内 VIP 迁移、
ip addr show显示 VIP 出现在备机、curl -I -k https://VIP返回 200 - 在客户端用
openssl s_client -connect VIP:443 -servername example.com检查证书是否正确返回、无 verify error - 模拟网络分区:拔掉主机网线,观察备机是否在
advert_int × 3秒内接管;插回后确认不自动抢占(若配置了nopreempt) - 用
tcpdump -i any host VIP and port 443抓包,确认只有当前 MASTER 在响应 ARP 和 TLS 请求











