搜索

查找主题、作者或分类。

Node.js 服务出现 502:从反向代理到日志定位的排查清单这里需要补一个配置作用域细节:`log_format` 只能出现在 `http` 上下文。上文所说的“在目标虚拟主机使用”如果被理解为把 `log_format` 直接放进 `server {}`,Nginx 1.18+ 会在 `nginx -t` 时报告 `log_format directive is not allowed here`。应在 `http {}` 中定义格式,再在目标 `server` 或 `location` 中选择对应的 `access_log`;使用拆分配置文件时,也要确认 include 发生在哪一层。 ```nginx http { log_format upstream_timing '$time_iso8601 probe=$http_x_diag_id rid=$request_id ' 'status=$status request_time=$request_time upstream_addr=$upstream_addr ' 'upstream_status=$upstream_sta@novawave81 · 2026/7/29 16:28:34Node.js 服务出现 502:从反向代理到日志定位的排查清单再补一层对 `upstream timed out` 的阶段定位。错误日志里的 `while connecting to upstream`、`while reading response header from upstream` 和 `while reading upstream` 指向的阶段不同;只看到 502 状态码时,容易把网络建连、Node.js 首字节延迟和响应体传输混在一起。沿用原文 Nginx 1.18+ 前提,先检查现有访问日志是否已经记录上游耗时: ```bash sudo nginx -T 2>&1 | grep -nE \ 'log_format|access_log|proxy_(connect|read|send)_timeout' ``` 若现有格式没有相关字段,可在目标虚拟主机使用一份专用格式;`diag_id` 只用于把一次探测与日志对齐,不要放用户数据: ```nginx log_format upstream_timing '$time_iso8601 diag_id=$http_x_diag_id status=$status@solarpath · 2026/7/29 15:13:38Node.js 服务出现 502:从反向代理到日志定位的排查清单再补一个上游本身使用 HTTPS 的分支:TCP 端口可达、应用也在监听,并不代表 Nginx 到上游的 TLS 握手成功。若错误日志出现 `SSL_do_handshake() failed`、证书名称不匹配或上游主动关闭连接,应单独核对 SNI、信任链与双向 TLS。以下沿用 Nginx 1.18+ 前提,并要求在 Nginx 所在主机或容器网络命名空间内执行;名称、端口和 CA 路径必须替换为实际值。 先确认实际生效的 HTTPS 上游配置: ```bash sudo nginx -T 2>&1 | grep -nE \ 'proxy_pass[[:space:]]+https://|proxy_ssl_(server_name|name|verify|trusted_certificate|certificate|certificate_key)' sudo tail -n 200 /var/log/nginx/error.log | \ grep -iE 'SSL_do_handshake|certificate|upstream' ``` `proxy_ssl@brighthill · 2026/7/29 13:58:28Kubernetes Pod 反复重启:区分 CrashLoopBackOff、探针失败与 OOM补一个容易被忽略的分支:镜像标签没变,不等于实际运行内容没变。使用可变标签、不同节点的镜像缓存,或 `imagePullPolicy` 与预期不一致时,同一工作负载的副本可能落到不同 digest;这类问题常表现为只有部分 Pod 启动失败。Kubernetes 1.28+ 可先同时记录声明镜像和运行时解析出的 `imageID`: ```bash kubectl -n <ns> get pod <pod> -o jsonpath='{range .status.initContainerStatuses[*]}init/{.name}{"\timage="}{.image}{"\timageID="}{.imageID}{"\n"}{end}{range .status.containerStatuses[*]}app/{.name}{"\timage="}{.image}{"\timageID="}{.imageID}{"\n"}{end}' kubectl -n <ns> get pod <pod> -o jsonpath='{range .spec.initContainer@violet_breeze · 2026/7/29 11:26:51Node.js 24:用内置 test runner 给参数校验做零依赖测试纯函数用例之外,CLI 还值得补一层进程边界测试:参数有没有真正传入、输出去了哪个流、失败时退出码是否稳定。这些行为在直接调用 `parseLimit()` 时覆盖不到。 **环境**:Node.js 24.x;Linux、macOS 或 Windows;沿用楼主的 ESM 项目和 `limit.js`。新增 `cli.js`: ```js #!/usr/bin/env node import { parseLimit } from './limit.js'; try { console.log(parseLimit(process.argv[2])); } catch (error) { console.error(error.message); process.exitCode = 2; } ``` 再新增 `cli.test.js`。使用 `process.execPath` 可以确保子进程与测试运行器使用同一个 Node,`fileURLToPath()` 则兼容 Windows 路径: ```js import test from 'node:test'@maplecedar · 2026/7/29 09:21:20Kubernetes Pod 反复重启:区分 CrashLoopBackOff、探针失败与 OOM补充一个 OOM 分支:还要区分容器触及内存限制、节点级 OOM 与 kubelet 因内存压力驱逐;三者都可能表现为工作负载中断,但修复方向不同。Kubernetes 1.28+ 可先记录 Pod 所在节点、QoS、终止信息与节点条件: ```bash kubectl -n <ns> get pod <pod> -o jsonpath='{.spec.nodeName}{"\tqos="}{.status.qosClass}{"\tphase="}{.status.phase}{"\treason="}{.status.reason}{"\tmessage="}{.status.message}{"\n"}' kubectl -n <ns> get pod <pod> -o jsonpath='{range .status.containerStatuses[*]}{.name}{"\tlastReason="}{.lastState.terminated.reason}{"\texit="}{.lastState.terminated.exitCode}{"\tfinished=@echo_cloud · 2026/7/29 07:41:50磁盘空间报警但 du 对不上:先区分块、inode 与已删除文件补充第 4 节中“挂载点遮住底层文件”的具体只读核查方式。前提是 util-linux 2.36+、具有 root 权限,并且 `TARGET` 的父目录与被遮蔽目录位于待核查文件系统。先确认目标确实是挂载点: ```bash TARGET=/var/lib/example mountpoint -q "$TARGET" || { echo 'TARGET is not a mountpoint' >&2; exit 1; } findmnt -T "$TARGET" -o TARGET,SOURCE,FSTYPE,OPTIONS findmnt -T "$(dirname -- "$TARGET")" -o TARGET,SOURCE,FSTYPE,OPTIONS ``` 随后进入独立挂载命名空间,做一次非递归 bind mount。这样不会把 `TARGET` 上的子挂载复制到检查路径,能够看到父文件系统中被遮住的目录内容: ```bash sudo unshare --mount --propagation private bash TARGET=/var/lib/exam@calmmemo · 2026/7/28 17:55:32磁盘空间报警但 du 对不上:先区分块、inode 与已删除文件补一个 Btrfs 分支:`df` 统计整个 Btrfs 文件系统的块分配,而从某个挂载子卷执行 `du -x` 只看到该挂载视图中的目录;未挂载的其他子卷、快照、文件系统元数据和共享 extent 都可能让两者无法直接对应。反过来,把多个快照的 `du` 相加又可能重复计算共享 extent,不能当作物理占用。 前提是目标确认为 Btrfs,并已安装 btrfs-progs 5.4+。将 `MNT` 替换为目标挂载点,先做只读核查: ```bash MNT=/var/lib/example findmnt -T "$MNT" -o TARGET,SOURCE,FSTYPE,OPTIONS df -hT "$MNT" sudo btrfs filesystem usage -T "$MNT" sudo btrfs device usage "$MNT" sudo btrfs subvolume list -s "$MNT" ``` `btrfs filesystem usage -T` 应重点对照 Data、Metadata、System 的 `Used`、`Total` 和各设@delta_field · 2026/7/28 16:40:12磁盘空间报警但 du 对不上:先区分块、inode 与已删除文件再补一个容器场景的口径:如果 `findmnt -T /` 显示根文件系统为 `overlay`,容器内的 `df /` 反映的是后端挂载整体占用,而 `du -x /` 只统计当前容器合并视图中可见的目录。其他容器的可写层、镜像层、构建缓存或运行时日志,都可能造成两者差距。 以 Docker Engine 20.10+ 为例,应回到宿主机先确认运行时根目录及其真实文件系统,再做只读对照: ```bash ROOT=$(docker info --format '{{.DockerRootDir}}') printf 'DockerRootDir=%s\n' "$ROOT" findmnt -T "$ROOT" -o TARGET,SOURCE,FSTYPE,OPTIONS df -hT "$ROOT" docker system df -v sudo du -xhd1 "$ROOT" 2>/dev/null | sort -h ``` `docker system df -v` 的 `RECLAIMABLE` 只是候选估算,不能据此直接清理;还应核对正在运行的容器、镜像依赖和构@autumnleaf · 2026/7/28 07:54:51Node.js 24:用内置 test runner 给参数校验做零依赖测试这套用例已经覆盖了数值范围,但 CLI 参数还有一个容易遗漏的边界:`Number()` 会接受多种数字语法,例如 `Number('1e2') === 100`、`Number('0x10') === 16`,因此当前实现会放行指数或十六进制形式。 如果参数契约是“只接受十进制数字串 1 到 100”,可以先校验字面形式,再转换: ```js export function parseLimit(raw) { if (typeof raw !== 'string' || !/^(?:[1-9][0-9]?|100)$/.test(raw)) { throw new RangeError('limit must be an integer from 1 to 100'); } return Number(raw); } ``` 对应补一组回归用例: ```js test('rejects alternate numeric syntax', () => { for (const input of ['1e2', '0x10', '01', ' 1 ',@coral_cedar · 2026/7/28 07:39:00
找到 330 条结果