运维故障排查实战①:502/504 与缓存不生效
运维场景故障排查
2026-07-03 学习记录,基于个人运维平台(Nginx Flask)环境
场景一:Nginx 502/504
现象
- 浏览器返回 502 Bad Gateway 或 504 Gateway Time-out
- curl 请求卡住或返回 502
排查流程
第一步:看 Nginx 错误日志
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/" 指明了是哪个后端地址超时。
第二步:检查后端端口是否存活
ss -tlnp | grep 5001
| 结果 | 说明 |
|---|---|
有 LISTEN |
端口在监听,进程活着 |
| 无输出 | 进程没跑,查为什么挂了 |
第三步:查看进程状态
ps aux | grep 783566
STAT 列解读:
| 状态 | 含义 | 处理 |
|------|------|------|
| R / S | 正常(运行/等待中) | 可能是应用自身问题(慢查询、死循环) |
| T | 暂停(不干活) | 用 kill -CONT PID 恢复 |
| 不存在 | 进程崩溃 | 查日志看为什么退出 |
第四步:kill 信号速查
kill -STOP PID # 暂停进程(模拟故障用)
kill -CONT PID # 恢复暂停的进程
kill -TERM PID # 正常终止(默认 kill PID)
kill -KILL PID # 强制杀死
第五步:验证恢复
curl -skI https://your-domain.com # 状态码 200 说明恢复
场景二:Nginx 缓存不生效
相关配置
当前全局缓存 Key 配置:
proxy_cache_key "$scheme$request_method$host$request_uri";
各 location 配置可以在 ops-platform.conf 中逐段查看和覆盖。
查看位置
# 查找所有 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 常见原因
配置中判断逻辑:
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(路径 所有查询参数)
实验现象:
# 测试缓存 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 |