用 APM 全链路追踪,29ms 内定位到 Docker 部署的 SSL 配置错误

一步一个脚印一个坑 1小时前 ⋅ 4 阅读
ad

这是一个真实的排查案例。没有日志打印的神操作,没有凭经验瞎猜的过程,只有一张链路追踪图,直接把问题定位到了具体的代码位置和请求节点。


起因:部署完成,注册接口一直 500

最近在帮一个客户用 Docker 镜像部署 Webfunny 私有化系统。镜像拉下来,容器启动顺利,服务也跑起来了。

但当我们打开页面,进行首次注册的时候,接口一直返回 500

第一反应当然是去看日志。翻了一圈容器日志,找到了一行报错:

POST http://your-domain.com:80/wfMonitor/monitorBaseInfo → 301
GET https://your-domain.com:80/wfMonitor/monitorBaseInfo → error

日志里能看到的信息就这些——某个接口调用失败了,但为什么失败,失败在哪个环节,日志完全没有说清楚。

这种情况就很头疼:你知道接口出错了,但不知道是网络问题、配置问题、还是代码问题。如果靠猜,可能要折腾半天。


转机:打开 APM 自监控

Webfunny 本身就内置了一套自监控系统——系统会对自己的服务进行监控,包括接口调用链路、耗时、状态码、异常信息。

我们打开 APM 的全链路追踪模块,等了片刻让数据采集上来,然后找到这次注册请求对应的 TraceID,点开链路详情。

整条链路一眼就清楚了:


链路图说了什么

从链路图里可以看到这次请求的完整过程:

  • 总耗时:29ms
  • 应用数:1,节点数:18
  • 请求入口:GET /wfCenter/registerForSaas

往下展开,能看到:

  1. 注册逻辑走到了 Controller/CenterUserController.registerForSaas
  2. 然后调用了 POST http://your-domain.com:80/wfMonitor/monitorBaseInfo
  3. 这个请求返回了 301 跳转
  4. 跳转目标是 GET https://your-domain.com:80/wfMonitor/monitorBaseInfo
  5. 这个 HTTPS 请求连接到了 :80 端口,TLS 握手失败

右侧的异常详情写得非常清楚:

error.message: write EPROTO 14070351799289:error:1408F10B:SSL routines:
ssl3_get_record:wrong version number:
/deps/openssl/openssl/ssl/record/ssl3_record.c:332

error.object: EPROTO

根本原因:80 端口被强制跳转到 https://domain:80

问题找到了。

整个链路失败的根源是:客户的服务器对 http://domain/ 配置了强制 HTTPS 跳转,但跳转目标 URL 写错了

正常的 HTTPS 跳转应该是:

http://your-domain.com/ → https://your-domain.com/(443端口)

但实际跳转的目标是:

http://your-domain.com:80/ → https://your-domain.com:80/(80端口)

:80 是 HTTP 端口,不支持 SSL 握手。代码拿到 301 跳转后,试图用 HTTPS 去连 80 端口,自然就报了 EPROTO: wrong version number——SSL 协议和端口对不上。

这个问题在普通日志里完全看不出来,因为日志只记录了"调用失败",没有记录跳转过程和 SSL 握手的细节。


修复方式

找到原因后,修复就很简单了。检查客户服务器的 Nginx 配置,找到 HTTP 强制跳转的规则:

# 错误配置(保留了 :80 端口)
return 301 https://$host:$server_port$request_uri;

# 正确配置(不带端口号,自动走 443)
return 301 https://$host$request_uri;

改完之后重启 Nginx,重新注册,接口正常返回,问题解决。


这个案例说明了什么

如果没有 APM 链路追踪,这个问题的排查路径大概是这样的:

  1. 看到 500,去看应用日志
  2. 日志里看到接口报错,猜是网络问题
  3. ping 域名、telnet 端口、curl 接口
  4. 发现 301 跳转,再去排查跳转配置
  5. 找到 Nginx 配置,定位问题

这个过程快则半小时,慢则几个小时,而且每一步都依赖经验。

有了 APM 全链路追踪,整个过程是:

  1. 打开链路详情
  2. 看到 301 跳转到 https://domain:80
  3. 看到 EPROTO: wrong version number
  4. 直接去改 Nginx 配置

定位时间从小时级压缩到了分钟级。


一点延伸

这类问题在私有化部署的场景里很常见,尤其是在以下几种情况:

  • 服务器之前跑过其他业务,Nginx 有遗留的 HTTPS 跳转配置
  • 客户自己配置了全站 HTTPS,但跳转规则写得不规范
  • Docker 部署时端口映射和域名配置没有对齐

排查这类问题,光靠应用日志是不够的。需要能看到完整的请求链路,包括每一次跳转、每一个 DNS 解析、每一次 TCP 握手,才能准确定位。

这正是 APM 全链路追踪的价值所在。


Webfunny 的 APM 功能支持私有化部署,和前端监控、埋点系统集成在同一个平台,无需单独接入,一套 SDK 搞定:

关于Webfunny

Webfunny专注于前端监控系统,前端埋点系统的研发。 致力于帮助开发者快速定位问题,帮助企业用数据驱动业务,实现业务数据的快速增长。支持H5/Web/PC前端、微信小程序、支付宝小程序、UniApp和Taro等跨平台框架。实时监控前端网页、前端数据分析、错误统计分析监控和BUG预警,第一时间报警,快速修复BUG!支持私有化部署,Docker容器化部署,可支持千万级PV的日活量!

  点赞 0   收藏 0
  • 一步一个脚印一个坑
    共发布142篇文章 获得4个收藏
全部评论: 0