✏️ 编辑

运维故障排查实战①:502/504 与缓存不生效

创建于 2026-07-03 09:46:59 · 更新于 2026-07-05 09:03:47

运维场景故障排查

2026-07-03 学习记录,基于个人运维平台(Nginx Flask)环境


场景一:Nginx 502/504

现象

  • 浏览器返回 502 Bad Gateway 或 504 Gateway Time-out
  • curl 请求卡住或返回 502

排查流程

第一步:看 Nginx 错误日志

Bash
tail -30 /var/log/nginx/error.log

关键错误类型判断:
| 日志原文 | 含义 |
877733#877733: *54462 upstream timed out (110: Connection timed out) while reading response header from upstream, client: 43.134.84.11, server: zhoujiayi.xyz, request: "HEAD / HTTP/2.0", upstream: "http://127.0.0.1:5001/", host: "zhoujiayi.xyz"
|----------|------|
| upstream timed out (110: Connection timed out) | 后端进程在但不响应请求(卡住/暂停/死锁) |
| connection refused | 后端端口没监听(进程挂了) |

日志中 upstream: "http://127.0.0.1:5001/" 指明了是哪个后端地址超时。

第二步:检查后端端口是否存活

Bash
ss -tlnp | grep 5001
结果 说明
LISTEN 端口在监听,进程活着
无输出 进程没跑,查为什么挂了

第三步:查看进程状态

Bash
ps aux | grep 783566

STAT 列解读:
| 状态 | 含义 | 处理 |
|------|------|------|
| R / S | 正常(运行/等待中) | 可能是应用自身问题(慢查询、死循环) |
| T | 暂停(不干活) | 用 kill -CONT PID 恢复 |
| 不存在 | 进程崩溃 | 查日志看为什么退出 |

第四步:kill 信号速查

Bash
kill -STOP PID   # 暂停进程(模拟故障用)
kill -CONT PID   # 恢复暂停的进程
kill -TERM PID   # 正常终止(默认 kill PID)
kill -KILL PID   # 强制杀死

第五步:验证恢复

Bash
curl -skI https://your-domain.com   # 状态码 200 说明恢复

场景二:Nginx 缓存不生效

相关配置

当前全局缓存 Key 配置:

Nginx
proxy_cache_key "$scheme$request_method$host$request_uri";

各 location 配置可以在 ops-platform.conf 中逐段查看和覆盖。

查看位置

Bash
# 查找所有 proxy_cache_key 配置
grep -rn "proxy_cache_key" /etc/nginx/

# 查看具体 location 的缓存配置
grep -A20 "location / {" /etc/nginx/conf.d/ops-platform.conf

X-Cache-Status 含义

状态 含义
HIT 命中缓存,直接返回
MISS 没命中,去后端取了并缓存
EXPIRED 缓存过期,去后端刷新
BYPASS 主动绕过缓存(根据条件判断不走缓存)
UPDATING 正在刷新,先返回旧的

BYPASS 常见原因

配置中判断逻辑:

Nginx
if ($request_method != GET) { set $cache_bypass 1; }
if ($args ~* "saved=|deleted=|restored=") { set $cache_bypass 1; }
  • curl -I 发的是 HEAD 请求 → HEAD != GET → BYPASS
  • 带上 ?saved=1 / ?deleted=1 等参数也会 BYPASS

Cache Key 实验与核心原理

当前 Key: $scheme$request_method$host$request_uri
- $request_uri = 完整 URI(路径 所有查询参数)

实验现象:

Bash
# 测试缓存 Key 是否受参数影响
curl -sk -D - -o /dev/null https://your-domain.com/
curl -sk -D - -o /dev/null "https://your-domain.com/?t=$(date  %s)"

结果分析:
| 请求 | Cache Status | 原因 |
|------|-------------|------|
| / → HIT | 无参数,Key 稳定 |
| /?t=123 → MISS | t 带入了 Key,不同值不同 Key |
| /?t=123 第二次 → HIT | 同样的 Key,命中 |

优化方案

方案 Key 配置 适用场景
A: 纯路径(推荐) $scheme$host$uri 页面不依赖 query 参数时
B: 选参数纳入 `$scheme$host$uri?page=$arg_page