记录一下问题排查过程

# 问题描述:

前端和后端在联调接口,因为一些特殊需要,需要将接口超时时间设置为2分钟,但是几经更改仍然没有生效,大概30秒左右超时断开,接口调用是通过域名,因此我询问nginx影响,得到反馈是已经设置了,但仍然是超时了。随后便开始排查这个问题。

# 问题分析过程

# 确认问题复现步骤

在本次问题中,可以通过curl请求即可复现。

# 是否是nginx设置了超时?

# 确认部署机器

假设接口是:https://api.xxxx.com ,我需要确认实际请求的机器,使用如下命令

1
curl -v 'https://api.xxxx.com'

通过-v命令可以,查询到curl请求更详细的过程,格式类似如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
*   Trying 198.18.1.220:80...
* Connected to baidu.com (198.18.1.220) port 80 (#0)
> GET / HTTP/1.1
> Host: baidu.com
> User-Agent: curl/7.87.0
> Accept: */*
> 
* Empty reply from server
* Closing connection 0
curl: (52) Empty reply from server

便得到第一步请求到达了 198.18.1.220 机器,登录进行查看。

# 确认web服务器是什么查看日志

公司用到最多的是nginx和haproxy,因此直接使用命令可以查到,这二者同时使用存在端口冲突,一般只会一台机器有一个

1
2
ps -ef | grep nginx
ps -ef | grep haproxy

结果类似如下

1
root      2662     1  0 07:12 ?        00:00:00 nginx: master process /usr/sbin/nginx

通过结果可分析出进程的启动目录,目的是找到日志文件。如果进程中无法分析出,可以进一步通过find命令查看,nginx默认配置文件是nginx.conf

1
find / -name nginx.conf

在logs目录中找到nginx错误日志error.log,检索接口,看到有超时日志,接着查看配置信息,有30秒超时设置,因此这里是要更改的。

# nginx配置更新

将30秒超时时间更改为300秒后,再次请求接口,仍然大概30秒断开,但是这次并没有错误信息,返回空值。需要继续排查下去。

# 是否是apigateway层原因

nginx在本次请求链中的作用是反向代理,直接将请求转发到apigateway层,这是一个golang程序,之前有过一些了解,直接找到其日志文件,再次curl进行复现,令我好奇的是,gateway程序有打印正常返回日志,但是却未返回。

因此网关层应该是有设置超时时间的。

在conf目录中找到了几个配置文件,看了一圈并不能确认哪个是超时字段,只有app.conf中有个ServerTimeout字段设置了20,此时我并不知道他就是beego的默认启动配置文件。抱着实验的想法,将20改成了60,将程序重启,然后就有正常返回了。后面还找了好一会ServerTimeout的初始化位置,后面才知道这里是在框架层做的,所以是找不到的。

到此,解决了这个问题。

总结改动点:nginx路径超时时间、apigateway网关层超时时间。

Licensed under CC BY-NC-SA 4.0