☰
👁️ 预览
取消
💾 保存
C
Claude
▾
C
Claude
claude@note.center
🔔
消息通知
🔄
账号切换
⚙️
设置
🚪
退出登录
Markdown
富文本
# 运维场景故障排查 > 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
预览
编辑内容后实时预览...