LB/网关故障应急处置实战:后端全挂、会话失效、证书过期的现场排查复盘
2026/9/1 23:48:50 网站建设 项目流程

兄弟们,做网络和云运维,最怕半夜接到“业务全挂了”的电话。负载均衡(LB)和网关是流量的大门,一旦出事,影响面就是100%。

今天不讲故事,直接上干货。复盘LB/网关故障的应急处置SOP,全是现场拿血泪换来的经验。

🚨 故障初期“四不要”红线(保命必看):

  1. 不要无脑重启网关实例或节点:网关是流量入口,重启会导致存量TCP连接瞬间全断,业务直接报连接重置,故障面瞬间扩大。
  2. 不要在没看日志没抓包前,就瞎改健康检查或超时参数:改错了可能把原本正常的后端误判为宕机,或者把超时时间改得无限长,直接把网关连接池拖死。
  3. 不要轻易把流量整体切走:切流量会丢失用户会话和长连接,如果备用集群容量没评估好,切过去就是二次雪崩。
  4. 不要随手改DNS TTL或直接切解析:DNS有缓存,改TTL不会立刻生效,盲目切解析会导致部分用户去老机房,部分去新机房,状态错乱。

处置总原则就一句话:“先分层定位,再动开关;先止血,再根治”。


一、 正确开局:先分层,别一上来就动网关配置

遇到网关告警,第一件事是确认故障到底在哪一层。别一上来就登上网关服务器改配置。

“客户端 → DNS → LB/网关 → 后端RS(Real Server)”的链路逐层往下压。用状态码、响应耗时、连通性把问题范围收敛:

  1. 客户端/网络问题:网关日志没收到请求,或者网关返回200但客户端拿不到。通常是运营商劫持、本地网络不通、或者客户端DNS被污染。
  2. 网关本身问题:网关进程挂了、CPU打满、连接池耗尽、证书过期、配置错误。现象通常是502/504/503,或者SSL握手失败。
  3. 后端服务问题:网关正常转发,但后端RS不响应、响应慢、或者返回500。网关日志会明确记录upstream timed outconnection refused

二、 排查主链路:命令与现象对照

排查时,手里要有武器。以下命令直接复制使用:

1. 客户端侧探测(看表象)

# 看返回头、状态码和详细耗时(-w 自定义输出格式)curl-v-o/dev/null-s-w"HTTP_CODE:%{http_code}\nTIME_TOTAL:%{time_total}\nTIME_CONNECT:%{time_connect}\n"https://yourdomain.com/api/health# 指定Host和协议,绕过本地DNS或强制走HTTP/HTTPScurl-H"Host: yourdomain.com"-khttps://1.2.3.4/api/health# 现象对应:# - HTTP_CODE 502/504:网关没拿到后端响应,重点查后端和网关超时配置。# - HTTP_CODE 499:客户端主动断开,通常是后端太慢,用户等不及刷新了页面。# - TIME_TOTAL 很大但 TIME_CONNECT 很小:后端处理慢(慢后端)。

2. DNS与证书排查

# 查解析结果、TTL和权威DNSdigyourdomain.com +tracenslookupyourdomain.com8.8.8.8# 现象对应:解析到的IP不是期望的LB VIP,或者TTL还是86400(说明缓存没刷新)。# 检查HTTPS证书链和到期时间echo|openssl s_client-connectyourdomain.com:443-servernameyourdomain.com2>/dev/null|openssl x509-noout-dates-subject# 现象对应:证书过期、证书链不完整(缺少中间证书导致部分手机浏览器报错)。

3. 网关侧深度排查(看内情)

# 抓包看TCP握手和HTTP响应(过滤特定端口)tcpdump-ieth0 port80-nn-tttt-c100# 查网关访问日志和错误日志(以Nginx为例)tail-f/var/log/nginx/access.log|grep-E"502|504|499"tail-f/var/log/nginx/error.log|grep-iE"upstream|timeout|refused"# 查网关健康检查状态与后端RS存活列表(通过网关管理API或控制台)# 现象对应:error.log 出现 "no live upstreams",说明健康检查把所有后端都踢了。# 统计连接数和TIME_WAIT(看是不是连接池爆了)ss-ant|awk'{print $1}'|sort|uniq-c|sort-nrss-s# 现象对应:TIME_WAIT 堆积上万,或者 ESTABLISHED 达到网关上限,说明短连接风暴或后端不释放连接。

三、 高频故障现场逐个拆

1. 后端全挂或部分异常

  • 现象:大面积502,或者部分请求成功部分502。
  • 排查:查网关健康检查日志,看RS是不是被误判下线。如果是部分502,看是不是某个RS权重配错了,或者某台RS进程假死(端口在,但不处理请求)。
  • 处理:假死节点直接踢出LB;如果是健康检查太敏感(比如超时设了100ms),调大阈值。

2. 会话保持失效

  • 现象:用户反馈登录态丢失,或者请求被轮询到不同后端导致数据不一致。
  • 排查:查网关配置,看是基于源IP保持还是Cookie保持。如果是源IP,检查客户端出口IP是否漂移(比如经过了多层NAT);如果是Cookie,检查后端应用是不是自己把Session清了。
  • 处理:修正保持策略,或者让后端应用改用Redis集中存储Session,彻底解耦。

3. HTTPS证书过期或链不完整

  • 现象:浏览器报“连接不安全”,部分APP接口调不通,网关error.log有SSL握手报错。
  • 排查:用openssl命令看证书到期时间和证书链。
  • 处理:紧急替换证书。如果是链不完整,把中间证书拼接到服务器证书后面。

4. 限流/熔断误触发

  • 现象:大量请求返回 429 (Too Many Requests) 或 503。
  • 排查:查网关限流日志,看是不是QPS阈值设得太低,或者某个大客户的IP被误判为攻击。
  • 处理:紧急调大限流阈值,或者把白名单IP加到限流豁免列表。

5. 连接数打满或TIME_WAIT堆积

  • 现象:新建连接失败,网关报cannot assign requested addresstoo many open files
  • 排查:用ss -s看连接状态。TIME_WAIT 堆积通常是因为网关到后端是短连接,且并发高。
  • 处理:开启网关到后端的 Keepalive(长连接);调整内核参数net.ipv4.tcp_tw_reuse = 1;调大文件描述符限制ulimit -n

6. 慢后端把网关拖垮

  • 现象:网关CPU不高,但响应极慢,最后大面积504。
  • 排查:看访问日志里的upstream_response_time,发现动辄十几秒。网关的连接池被这些慢请求占满,新请求进不来。
  • 处理:调小网关的proxy_read_timeout(比如从60s改到5s),让网关快速失败释放连接;同时推动后端优化或扩容。

7. DNS问题

  • 现象:网关日志正常,但客户端就是访问不通,或者解析到了旧IP。
  • 排查:用dig查各地DNS解析结果。
  • 处理:如果是本地运营商缓存,只能等TTL过期,或者让用户改DNS(如114.114.114.114)。如果是切流后不生效,检查权威DNS的TTL是否真的改小了。

8. 配置变更误操作

  • 现象:刚发版或改完配置,网关直接挂掉或路由全错。
  • 排查:查配置变更历史,对比 diff。
  • 处理:别排查了,直接回滚配置!网关配置必须经过语法检查(如nginx -t)才能生效。

四、 恢复与流量切换:分场景给策略

止血的时候,动作要轻。区分三种操作的代价:

  1. 改网关配置(如调超时、改权重)
    • 代价:通常会导致网关 reload,存量长连接可能会断(取决于网关实现),但影响最小。
    • 策略:首选。必须带灰度,先改一台节点验证。
  2. 切DNS解析(切机房/切VIP)
    • 代价:有TTL延迟。在TTL过期前,部分用户去老机房,部分去新机房。TCP长连接会断开,用户会话可能丢失。
    • 策略:机房级故障(如断电、断网)才用。切之前必须确认新机房容量能扛住全量流量,且后端应用支持多活或能快速同步状态。
  3. 重启网关实例
    • 代价:最狠。该实例上的所有存量连接瞬间全断,客户端直接报错。
    • 策略:不到万不得已(如网关进程死锁、内存泄漏无法恢复)不用。必须先从LB摘除该节点,等流量清空后再重启。

核心忠告:切流量前,一定要评估后端的承受能力。把流量切给一个没扩容的备用集群,等于把故障转移,甚至引发二次雪崩。


五、 根因分析:别总让网关背锅

业务恢复了,复盘时别总说是“网关软件有bug”。99%的网关故障,根因都是配置和架构问题

  1. 健康检查配置不合理:探测路径太深(带了数据库查询),导致后端一慢,健康检查就超时,把正常节点踢了。
  2. 超时/重试参数失衡:网关超时时间大于后端超时时间,或者网关重试次数太多,导致请求放大,把后端打挂。
  3. 证书无自动化:靠人肉记日子去换证书,必过期。
  4. 后端容量评估不足:大促前没压测,流量一上来后端先挂,网关跟着报502。
  5. “慢变量”没人盯:DNS解析漂移、证书到期、内核参数被悄悄改掉,平时没告警,出事才发现。

怎么定责?
不要扯皮。拉出网关的access.logerror.log,结合 Prometheus 的时间线。看是网关自身指标(CPU/连接数)先异常,还是后端upstream_response_time先异常。数据说话,一锤定音。


六、 事后加固:擦屁股的艺术

  1. 健康检查优化:探测路径必须是轻量级的(如/health),只检查进程存活,不依赖下游数据库。阈值要合理(如连续3次失败才下线)。
  2. 参数化与压测:超时、重试、限流参数必须经过压测验证。严禁网关超时时间 > 后端超时时间。
  3. 证书自动化:上 ACME 协议(如 Let’s Encrypt + cert-manager)或统一证书平台,到期前30天必须告警。
  4. 变更管控:网关配置变更必须走审批,必须有语法检查,必须支持一键回滚。
  5. 监控告警补齐:覆盖可用性、延迟、4xx/5xx比例、连接数、证书剩余天数。告警要分级,别半夜乱叫。
  6. 容量与容灾:定期评估后端容量,制定扩容预案。多活/容灾切换每年至少演练一次,别等真出事才发现备用机房是空的。

七、 总结:高频踩坑血泪教训

最后,盘点几个无数人踩过的坑,大家避避雷:

  1. 没分层定位就动网关:客户端网络问题,你在那狂改网关配置,改一天也修不好。
  2. 误把后端故障当网关问题修:后端OOM了,你以为是网关转发有问题,去调网关参数,结果网关连接池被慢请求拖死。
  3. 直接重启网关导致存量连接全断:网关有点卡顿,你直接systemctl restart,结果引发大面积客诉。正确做法是先摘流。
  4. 限流误触发当成攻击在解:正常业务高峰触发了限流,你以为是CC攻击,拼命加白名单,结果把真攻击放进了。
  5. 改完TTL不生效是缓存背锅:改了DNS的TTL,发现没生效,其实是中间递归DNS或者客户端本地缓存没清,别急着骂权威DNS。
  6. 切流量不灰度结果全量炸:一键切100%流量到新版本/新机房,结果新环境有Bug,直接全量翻车,连回滚都来不及。
  7. 证书到期没人管全靠用户报障:没有证书监控,每次都是客服接到用户投诉“APP登不上”了,运维才知道证书过期了。

网络和网关运维,就是走在钢丝上。流量无小事,配置需谨慎。希望这篇实战复盘,能让大家在遇到LB/网关故障时,心里有底,手中有招。

如果你觉得这篇文章有用,或者你在排查网关故障时遇到过什么奇葩坑,欢迎在评论区留言交流!

觉得干货不错,别忘了点个赞、收藏一下,以备不时之需(毕竟半夜排查故障时,你可能只想直接复制命令)!我们下期见!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询