阿里云WAF非幂等请求重试的坑
这段时间遇到了一个诡异的问题,用curl
或PostMan
去调用阿里云(经过了WAF)上一个需要很长时间返回的后端接口(可能在半小时以上),发现后端居然会处理三次
这种问题,排查的思路是什么呢?
- 第一,当然是看客户端是不是有重试,wireshark抓包如下
发现并没有重试,事情就变得比较有意思了。
另外curl
在默认情况下,只有connect
的超时时间(2min),并没有read
的超时时间,也就是curl
在connect
成功以后会永久等待。可以通过参数值来设置超时时间
-m, --max-time <seconds> |
另外,这里的keepalive
心跳包也比较有意思,后面再讲
- 第二,在
Nginx
机器抓包,验证,真的有请求多次
发现每到2分钟Nginx
就主动断掉了连接,重新建连接,发起请求
- 第三,在不经过
WAF
的情况下,调用看会不会有问题
怎么样不经过WAF呢?在阿里云内网,指定care.cctv.com
到一台nginx上就可以了,主要通过curl
的--resolve
来实现
curl -v -X POST \ |
为什么是900s
?
Nginx
配置大概如下:
upstream express_server{ |
在Nginx
配置这里,read
的超时时间就是900s
阿里云WAF
坑的地方,在于对于非幂等的POST
请求,依然进行了重试,完全没有节操