背景#
最近,负责基础设施的同事,要对一批测试环境机器进行回收,回收就涉及到应用迁移,问题是整个过程一团乱。比如服务器A上一堆应用要调用服务器B上一堆服务,结果服务器B被回收了,然后服务器A上一堆应用报错。
今天就是负责查一个问题,app上一个头像上传的接口,之前都好好的,不知道怎么就不能访问了,报错现象是在请求后等待n秒超时,然后服务端报错502。
这个服务也不知道谁维护的,可能维护的人早已离职了也说不定,这也是这边的常态吧,人走了,负责的服务还在服务器上跑,也没有交接文档。
问题现象#
链路梳理#
先上个图,再解释整个链路:
现象就是,app端调用外网ip(记作A): xxxx端口的某个接口,超时后报502错误,因为是http协议,能从响应中看出来是Apache。
然后,就是去找网络同事,问外网ip:xxx端口对应的内网ip和端口,得到了内网ip(记作B):80端口。接下来,又是找负责服务器的同事,要服务器B的密码,一开始以为是linux机器,没想到还是windows的。vnc登录进去后,根据端口号找到对应的进程,发现是Apache HTTP Server,这个东西我也不熟悉,知道它类似于nginx,功能类似,但是几乎一直没用过,所幸,在程序的根目录下,找到了一个配置文件,配置文件中配置了反向代理,将请求反向代理到了服务器C:8088端口。
这个服务器C,基本就是今天的主角了。
于是,又去找同事要服务器C的密码,这次还好,是个linux机器,查询8088端口对应的服务,是个nginx进程,然后查看该进程的配置文件,发现请求被反向代理到了本机的9901端口。
问题现象#
梳理完整个链路后,我决定去看看最后的java服务的日志,因为是第一次看到这个服务,也不知道日志文件在哪里。cd到/proc/服务pid/fd
目录下,看到了其打开的文件,里面有个日志文件,但是,打开日志文件,发现里面空空如也。
我又去调了调日志级别,然后app发起请求,发现还是没啥日志。
然后开始怀疑请求没到服务这里,行吧,那还是跟着链路排查下,看看怎么回事。
于是在linux机器上开启java服务的9901端口的抓包,然后重试,发现还是空空如也,什么包都没有。
Copy
tcpdump -i any tcp port 9901 -Ann
这就奇怪了,没到java服务,那到了nginx没有呢?然后开始抓nginx这块:
Copy