哪吒 Agent 无法上线排查

用分层证据定位 Agent 进程正常但面板离线、gRPC 403、502、超时和鉴权失败。

#type / debug #status / evergreen #tech / ops #tech / network #resource / nezha #protocol / grpc #platform / server

哪吒 Agent 无法上线排查

[!info] related notes

[!abstract] 排障顺序 服务进程 → DNS/端口 → TLS/HTTP2 → gRPC 路径 → 身份鉴权 → Dashboard 记录。不要因为网页能打开就跳过中间层。

快速决策树

flowchart TD
    A[Agent 离线] --> B{systemd active?}
    B -- 否 --> C[查 unit、路径、权限和架构]
    B -- 是 --> D{443 可连接?}
    D -- 否 --> E[查 DNS、路由、NSG、UFW]
    D -- 是 --> F{gRPC 探测返回 application/grpc?}
    F -- 否: 403 HTML --> G[Cloudflare gRPC/WAF/Access]
    F -- 否: 502/GOAWAY --> H[反代 h2c 配置]
    F -- 是 --> I{Agent 日志鉴权成功?}
    I -- 否 --> J[用户 client_secret、UUID]
    I -- 是 --> K[查 Dashboard 数据与前端筛选]

第一步:进程与配置唯一性

systemctl status 'nezha-agent*' --no-pager
systemctl list-unit-files --type=service | grep '^nezha-agent'
ps -o pid,ppid,etime,args -C nezha-agent

active 只表示进程没有退出,不表示它已经通过鉴权。若有多个 unit 或多个 config-xxxxx.yml,先转到重复注册排障。

第二步:网络与 TLS

getent ahostsv4 data.example.com
nc -vz data.example.com 443
curl -svI --connect-timeout 8 https://data.example.com/
  • timeout:优先查路由、云安全组、主机防火墙或源站只放行 CDN IP。
  • 证书错误:查域名、SNI、证书链和 tls/insecure_tls
  • Web 200:只能继续证明 Web 入口正常,不能结束排障。

第三步:gRPC 协议探测

curl --http2 -v -X POST \
  -H 'Content-Type: application/grpc' \
  https://data.example.com/proto.NezhaService/
证据典型根因
HTTP 403server: cloudflare、HTMLCloudflare Zone 未启用 gRPC,或安全规则阻断
502GOAWAYCaddy/Nginx 到 Dashboard 的 h2c/gRPC 转发错误
404 或普通 HTMLgRPC 路径没有进入正确 matcher
HTTP/2 + application/grpc + grpc-status: 12协议路径正常,可以继续查鉴权

第四步:临时启用 Agent 调试日志

sudo cp /opt/nezha/agent/config.yml \
  /opt/nezha/agent/config.yml.bak-before-debug
sudo sed -i 's/^debug: false/debug: true/' \
  /opt/nezha/agent/config.yml
sudo systemctl restart nezha-agent
sudo journalctl -u nezha-agent --since '-5 min' --no-pager

完成后恢复 debug: false 并重启,避免长期产生噪声日志。

典型日志解释

  • PermissionDenied + HTML 403:请求通常在 Dashboard 鉴权前被 CDN/代理拒绝。
  • context deadline exceeded:TCP/TLS 或 HTTP/2 通道未能在截止时间内就绪。
  • 连接建立后立即鉴权失败:核对用户生成的 client_secret,不要从 YAML 的旧全局字段猜测。
  • client UUID does not belong to the agent secret owner:密钥有效,但该 UUID 的服务器记录属于另一个用户或 legacy 所有者;应转移记录所有权或用目标用户重新注册。
  • Agent 不断访问 GitHub:可能正在检查更新;这不是 Dashboard 长连接,应结合目标 IP、持续时间与后续日志判断。

回归验证

  • 只存在预期 Agent unit 和进程。
  • gRPC 探测得到 application/grpc
  • Agent 日志不再循环重连。
  • Dashboard 中 UUID 对应记录在线。
  • 重启 Agent 后仍复用同一记录。

资料来源

创建于 2026/7/20 更新于 2026/7/20