AWS NLB配置Tomcat主机时故障切换异常问题排查
Hey Tina, sorry to hear you're stuck with this failover issue—let's break down the most likely causes and how to fix them:
先检查目标组的健康检查配置
这是NLB故障切换失效最常见的原因。你在NLB上用了TCP 443监听器,目标组可能默认用了TCP类型的健康检查,但TCP检查只会验证端口是否开放,不会确认Tomcat是否真的在正常提供服务。如果Tomcat停了之后,EC2上的端口被其他进程占用,或者Tomcat没有干净释放端口,NLB会误以为节点仍然健康。
建议把健康检查类型改成HTTP或HTTPS(和你的Tomcat服务协议匹配),并指定一个有效的检查路径,比如根路径/或者专门的健康端点/health(如果有的话)。同时检查阈值设置:把“不健康阈值”设为1或2,这样Tomcat停止后,NLB能快速标记节点为异常。用全新连接测试(别复用浏览器旧会话)
浏览器默认会保持TCP长连接(HTTP持久连接)。如果你停了Tomcat后只是刷新页面,浏览器可能还在复用之前和NLB建立的旧连接,而这个连接已经绑定到第一个节点——哪怕NLB已经标记该节点为不健康。
试试完全关闭浏览器再重新打开,用隐私窗口访问,或者用命令curl -H "Connection: close" https://你的NLB域名强制建立新连接。如果这样能切换到第二个节点,那问题就是连接复用导致的,这是TCP协议的正常行为:NLB不会主动终止已建立的连接,只会把新连接路由到健康节点。在AWS控制台确认目标组的实际健康状态
登录AWS EC2控制台,找到你的目标组,查看两个EC2实例的状态。如果停了Tomcat后第一个节点仍然显示“健康”,说明健康检查没检测到服务停止,回去调整健康检查配置即可。如果已经显示“不健康”,可以等30-60秒让NLB同步状态(通常会更快),再重试。也可以开启NLB访问日志,查看流量实际发到了哪个节点。排除安全组/防火墙问题
虽然可能性较低(毕竟初始配置能正常访问),但要确认EC2的安全组允许NLB健康检查IP段访问Tomcat端口,同时检查EC2内部的防火墙(比如iptables)有没有在Tomcat停止后阻止健康检查请求。
希望其中某个方法能帮你解决故障切换的问题!
备注:内容来源于stack exchange,提问作者Tina

