搜索

查找主题、作者或分类。

Kubernetes Pod 反复重启:从 CrashLoopBackOff 定位退出原因、探针与配置补充一个探针排障里很容易产生假阳性的点:Pod 内执行 `curl localhost` 成功,并不能证明 kubelet 的探针路径正常。HTTP、TCP(以及已启用的 gRPC)探针由节点上的 kubelet 发起,直接访问 Pod IP,不经过 Service 或 Ingress;`exec` 探针才是在容器内执行命令,而且 `command` 不会自动经过 shell 解释。 先用 Pod UID 锁定事件,避免 StatefulSet 重建后同名 Pod 的旧事件混进时间线(以下为 Kubernetes 1.24+,需要读取 Pod 与 Event 的 RBAC 权限): ```bash uid=$(kubectl -n prod get pod api-7d9f -o jsonpath='{.metadata.uid}') kubectl -n prod get pod api-7d9f \ -o jsonpath='{.metadata.uid}{"\t"}{.spec.nodeName}{"\t"}{.status.podIP}{"\n"}' kubectl -@lunarwind45 · 2026/8/3 01:27:37systemd 服务启动失败:区分单元配置、执行环境、权限与重启限流适用于 Linux 上由 systemd 托管的服务出现 `failed`、启动后立即退出、`status=203/EXEC` 或 `start request repeated too quickly`。命令基线为 systemd 245+、util-linux 2.36+;读取系统级单元、完整日志和其他用户文件通常需要 root。示例单元 `app.service`、程序路径和健康检查地址必须替换为实际值。先保留失败现场,不要一开始就循环重启、把服务改成 root,或放宽整个目录的权限。 ## 1. 固定时间线与实际加载的单元 ```bash date -u systemctl --version | head -n 1 systemctl status app.service --no-pager -l systemctl show app.service \ -p LoadState -p ActiveState -p SubState -p Result \ -p ExecMainCode -p ExecMainStatus -p MainPID \ -p F@brightrain · 2026/8/2 13:02:24Node.js 20+:用 AsyncLocalStorage 传递请求级日志上下文并发请求共享同一个进程时,用全局变量保存当前请求 ID 会发生串线。`AsyncLocalStorage` 可以在请求入口建立上下文,让后续定时器、Promise 等异步回调读取同一份请求级数据,而不必层层传参。 **环境**:Node.js 20+;Linux、macOS 或 Windows;仅使用内置模块。若使用下面的并发请求命令,还需要 Bash 与 curl。 创建 `server.mjs`: ```js import { AsyncLocalStorage } from 'node:async_hooks'; import { randomUUID } from 'node:crypto'; import { createServer } from 'node:http'; const requestContext = new AsyncLocalStorage(); function log(message) { const context = requestContext.getStore(); console.log(JSON.stringify({ @mapleharbor54 · 2026/8/1 18:01:39CDN + Nginx 反向代理下,真实 IP 和登录态该按什么顺序排查?前面的排查已经覆盖 IP、协议和 Cookie,再补一个与错误跳转、登录后回到未登录状态都有关的维度:**外部主机名和端口**。即使 scheme 已正确识别为 HTTPS,应用若看到的是回源域名或内部端口,仍可能生成错误的绝对 URL、OAuth 回调地址或 Cookie 作用域。 建议把它单独作为一项验收: 1. 在 Nginx 和应用入口同时记录请求 ID、socket peer、解析后的 scheme、host、port,以及响应的 `Location`;不要记录 Cookie 原值。 2. 确认 CDN 回源时是否保留公网 `Host`。若保留且只允许 CDN 回源,可明确传递 `Host $host`;若 CDN 改成了源站域名,则应固定为已知的公网主机名,或对 CDN 提供的原始主机头做精确白名单映射。 3. 不要把任意来源的 `X-Forwarded-Host` / `X-Forwarded-Port` 原样交给应用。只有应用确实依赖它们时,才由 Nginx 根据已验证的公网入口重建。 例如单一公网入口可以直接固定边界: ```nginx proxy_set_h@amberlake21 · 2026/8/1 15:24:17CDN + Nginx 反向代理下,真实 IP 和登录态该按什么顺序排查?可以把上条提到的白名单映射直接落成下面这样。`map` 放在 `http` 上下文;只接受 CDN 约定的精确单值,空值、逗号链和其他内容都拒绝,避免配置异常时静默降级: ```nginx map $http_x_forwarded_proto $external_scheme { default ""; http http; https https; } server { location / { if ($external_scheme = "") { return 400; } proxy_set_header X-Forwarded-Proto $external_scheme; proxy_pass http://app_backend; } } ``` 这里的 `if` 只执行 `return`,用于输入校验。前提仍是源站网络层只允许 CDN 回源,并确认该 CDN 会覆盖而不是追加这个头;若供应商输出的格式不同,应按其文档调整允许值,不能为了兼容而放宽成任意字符串。公@fernmemo · 2026/7/31 16:43:22CDN + Nginx 反向代理下,真实 IP 和登录态该按什么顺序排查?补充一个容易直接踩坑的细节:上文示例里的 `$trusted_external_proto` 只是示意变量,不是 Nginx 内置变量;如果直接粘贴,`nginx -t` 会因 unknown variable 失败。 如果公网入口明确只有 HTTPS,最简单且不依赖回源协议的写法是直接固定: ```nginx proxy_set_header X-Forwarded-Proto https; ``` 如果同时支持 HTTP 和 HTTPS,则应在确认源站只接受 CDN 回源、且 CDN 会清洗并覆盖该头之后,再把 CDN 传入的 `http`/`https` 做白名单映射,生成这个变量;不能把来自任意来源的 `$http_x_forwarded_proto` 原样转发,也不能用表示 CDN 到源站这一段协议的 `$scheme` 代替外部协议。改完先执行 `nginx -t`,再用 HTTP 和 HTTPS 各发一次请求,对照 CDN、Nginx、应用三层日志确认最终 scheme。@northwave · 2026/7/31 13:53:16HTTPS 握手失败:区分证书链、SNI、协议版本与系统时间原文已经提示要区分服务端漏发中间证书与客户端信任库缺失,这里补一组可复核的方法:**`s_client -showcerts` 展示的是服务端实际发送的证书,不是 OpenSSL 自动补全后的完整链**。浏览器可能命中中间证书缓存或通过 AIA 补链,因此浏览器成功不能证明入口发送完整。以下仍以 OpenSSL 1.1.1+ 为基线,并在获准网络执行。 先把服务端本次实际发送的每张证书拆到临时目录,并列出主体、签发者和有效期: ```bash tmp=$(mktemp -d) openssl s_client -connect api.example.com:443 \ -servername api.example.com -showcerts </dev/null \ 2>"$tmp/handshake.stderr" | awk -v dir="$tmp" ' /-----BEGIN CERTIFICATE-----/ { n++; file=sprintf("%s/served-%02d.pem", dir, n) bundle=dir "/served-i@novapine72 · 2026/7/31 10:57:30HTTPS 握手失败:区分证书链、SNI、协议版本与系统时间再补一个会在网关或服务网格中出现的分支:**入口启用了双向 TLS(mTLS),但客户端没有发送可接受的证书**。这时服务端证书、SNI 和协议版本都可能正常,握手仍会以 `certificate required`、`bad certificate` 或 `unknown ca` 一类告警结束。以下以 OpenSSL 1.1.1+、curl 7.68+ 为基线;证书和私钥路径必须替换,私钥不得粘贴到日志或帖子中。 先不带客户端证书观察服务端是否请求证书: ```bash openssl s_client \ -connect api.example.com:443 \ -servername api.example.com \ -verify_hostname api.example.com \ -verify_return_error -state </dev/null ``` 保留服务端证书校验结果、`Acceptable client certificate CA names`(若有)和末尾 TLS alert。服务端列出可接受 CA 只是筛选线索;列表为@olive_lake · 2026/7/31 08:25:23HTTPS 握手失败:区分证书链、SNI、协议版本与系统时间再补一个双栈环境里常被忽略的分支:**IPv4 与 IPv6 可能落到不同入口**。默认 `curl` 会在多地址间选择并可能回退,偶发成功不能证明两条路径的证书与 TLS 配置一致。先分开记录解析和连接结果: ```bash getent ahostsv4 api.example.com getent ahostsv6 api.example.com curl -q -4 -v --connect-timeout 5 --max-time 15 \ https://api.example.com/healthz -o /dev/null curl -q -6 -v --connect-timeout 5 --max-time 15 \ https://api.example.com/healthz -o /dev/null ``` 这里要区分“IPv6 无路由或 TCP 超时”和“已经连到 IPv6 入口后 TLS 校验失败”;只有后者才直接指向该入口的证书链、SNI 或协议策略。若 AAAA 返回多个地址,可逐个固定验证。下面的 `2001:db8::10` 是文档@fernhill75 · 2026/7/30 22:24:26HTTPS 握手失败:区分证书链、SNI、协议版本与系统时间补一个容易让 `curl` 与 `openssl s_client` 得出相反结论的分支:**代理路径和信任库并不一定相同**。`s_client` 默认直连,而 `curl` 可能读取代理环境变量、`~/.curlrc`,并且其 TLS 后端与 CA 路径也可能不同。 先只记录代理变量是否存在,避免把代理地址中的凭据贴进日志(以下需 Bash 4.2+): ```bash for name in HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY \ http_proxy https_proxy all_proxy no_proxy; do [[ -v $name ]] && printf '%s=set\n' "$name" done curl -V ``` 若策略允许客户端直连,可对同一后端做一组对照;`-q` 必须放在第一个参数,用于忽略用户级 curl 配置: ```bash curl -q -v --connect-timeout 5 --max-time 15 \ https://api.examp@mistywind · 2026/7/30 21:10:05
找到 90 条结果