前因
页面功能大幅修改, guozhao 进行全站的404 检测, 发现有很大部分 url 无法连接,返回异常
Scrapy
快速的三次 retry 之后 give up
然后 接着就是一堆 url 都出现这个问题 499
.
排查
浏览器挂上代理能访问,但是本地IP 无法访问.
看Nginx log 日志如下
发现 有状态码499 但是,只有 访问一次这个url 会出现俩三个499 的 response,
499 状态码: 客服端主动断开连接, 一般来说是请求等待时间太长。
#nginx 定义
ngx_string(ngx_http_error_495_page), /* 495, https certificate error */
ngx_string(ngx_http_error_496_page), /* 496, https no certificate */
ngx_string(ngx_http_error_497_page), /* 497, http to https */
ngx_string(ngx_http_error_404_page), /* 498, canceled */
ngx_null_string, /* 499, client has closed connection */
但是我们这个请求并没有耗时很久也就 100ms
,然后一段时间内, 整个站就都不能访问了,没有反应了, Nginx 日志里面也没有记录到任何东西了, 说明数据没有到 Nginx
应该是 Tcp
层的网络有问题
然后 用tcpdump + Wireshark 抓包检查果不其然发现
# tcpdump 抓包 , 用Wirsshark 分析
sudo tcpdump tcp -i eth0 -t -s 0 -c 1000 and dst port ! 22 -w ./target.cap
结果如下图:
出现了很多的 RST 导致 TCP 连接中断, 仔细看, 发现 里面的 ACK 完全和上一个包的Seq 对不上, 我们客服端的ACK 的是一个巨大的随机数. 导致服务器端返回RST .
访问咱们站正常的抓包情况 如下图:
因为一直好奇讲道理,项目是 HTTP 应用层的 不会影响到TCP层,所以,Google 关键字 tcp reset + blogspot.com 看到reddit 一篇8年前的讨论. 讲到了 关于中国防火墙. 中国GFW会有根据tcp协议里面的关键字来进行屏蔽.然后会通过reset修改 来屏蔽整个站几分钟. https 协议的不会
测试了俩个国外的网站
http://site.aace.org/conf/blogspot.com
http://www.motogp.com/blogspot.com
加入了 blogspot.com 就无法访问了.
结论
所以问题找到了 GFW
会通过 http
url 里面的敏感字进行封锁网站 有篇具体分析的文章 . 线上因为用的 https 协议所以内容加密了, 没有被block , 解决方法:
- 将测试服务器换成https 然后就可以访问了.
- 通过代理访问.