节点请求某个站点大部分时间都会导致ETIMEDOUT错误

眼镜

以下是我正在运行的系统的一些背景信息:

  • Ubuntu v 14.04

  • 节点v4.4.0

  • 节点request模块v2.69.0

所有这些都在位于纽约中心的DigitalOcean液滴/服务器上进行。

问题描述

所以我运行下面的js文件:

 var request = require('request'); var url = 'http://www.supremenewyork.com/'; request(url, function(err, res, body) { if (err) { console.log(err); return; } console.log('body:', body); }); 

在我的液滴上。 大概70-80%的时间我尝试这个,现在每一次我尝试这个,我会得到像这样的ETIMEDOUT错误:

 { [Error: connect ETIMEDOUT 52.6.25.180:80] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'connect', address: '52.6.25.180', port: 80 } 

值得注意的是,这些错误似乎是在“波涛”中出现的。 也就是说,我会设法在一段时间内得到一些请求,然后是一串ETIMEDOUT错误。 错误发生的频率比我能够通过大约3:1的错误成功率得到我的请求的次数要多得多。

在我自己的电脑上(运行OS X El Capitan的Mac),运行给定站点的js文件可以100%成功(即我以前从未遇到过这个问题)…所以我不确定为什么这个问题被包含到我的液滴。

任何指针将不胜感激。

研究/类似post:

  • Node.js 0.4.10。 http get()请求“ETIMEDOUT连接超时”

  • 为什么我不能ping通herokuapp < – 开始更好地了解这里发生的事情…

  • 在节点js < 上的http GET请求问题 < – 最初似乎很有帮助(后来实现的设置User-Agent可能没有什么意义)

附加信息

我也觉得值得一提的是,我正在主动要求的网站有一个脚本和网页扫描器的问题,所以如果他们试图防止这种情况发生,我不会感到惊讶。

可能的原因

  • IP地址阻塞 – > 不是这样(还),因为我仍然偶尔会从服务器得到响应,我不再能够从服务器得到任何forms的响应。 这可能是原因,但我真的很困惑,他们可能会这样做。 在我的本地机器上没有问题,没有问题从我的液滴上的浏览器请求他们的页面,但是这个。

  • 我的请求的速率限制 – >如果这是某种情况下,我想知道为什么这是特别发生在我的服务器上,而不是在我的本地计算机

  • 我提出请求的方式(即不通过浏览器)。 – >我不认为这是事实,因为我可以在本地计算机上以100%的响应率运行第一个脚本(除非我的本地计算机在将请求发送到其服务器之前有某些操作)。

  • 系统本身。 我只testing了我的Mac上的第一个脚本。 也许代码在不同的操作系统/系统上运行不同。

使用traceroute进行诊断

所以根据@ RabeeAbdelWahab的build议,我试图用traceroute来诊断问题。 但是,我几乎没有networking的知识,所以我不知道如何进行。 以下是一个输出示例:

 traceroute to <> (XXX.XXX.XXX.XXX), 30 hops max, 60 byte packets 1 45.55.192.254 (45.55.192.254) 8.903 ms 8.879 ms 8.865 ms 2 162.243.188.229 (162.243.188.229) 1.028 ms 162.243.188.233 (162.243.188.233) 0.986 ms 1.004 ms 3 xe-0-9-0-17.r08.nycmny01.us.bb.gin.ntt.net (129.250.204.113) 1.923 ms 1.918 ms nyk-b3-link.telia.net (62.115.45.5) 1.587 ms 4 ae-11.amazon.nycmny01.us.bb.gin.ntt.net (129.250.201.138) 1.935 ms ae-10.amazon.nycmny01.us.bb.gin.ntt.net (129.250.201.134) 1.586 ms * 5 nyk-b5-link.telia.net (213.155.131.137) 1.822 ms * * 6 * * 62.115.32.130 (62.115.32.130) 1.361 ms 7 * * * 8 * * * 9 * * * 10 54.239.110.157 (54.239.110.157) 33.817 ms * 54.239.110.133 (54.239.110.133) 27.683 ms 11 54.239.111.17 (54.239.111.17) 8.193 ms 205.251.244.128 (205.251.244.128) 7.883 ms 54.239.111.23 (54.239.111.23) 9.319 ms 12 205.251.245.55 (205.251.245.55) 8.253 ms 54.239.110.175 (54.239.110.175) 24.601 ms 205.251.244.195 (205.251.244.195) 8.250 ms 13 * 54.239.111.27 (54.239.111.27) 9.319 ms 54.239.111.29 (54.239.111.29) 9.290 ms 14 * * * 15 54.239.111.23 (54.239.111.23) 9.136 ms * * 16 * * * 17 * * * 18 * * * 19 * * * 20 * * * 21 * * * 22 * * * 23 * * * 24 * * * 25 * * * 26 * * * 27 * * * 28 * * * 29 * * * 30 * * * 

所以在运行traceroute几次后,我注意到了以下模式:

  • “***”输出从第15跳之后的某点或稍后开始。

  • 在“* * *” 205.251.XXX.XXX之前的最后一个IP地址大部分似乎在与地址205.251.XXX.XXX (更常见的情况)或54.239.XXX.XXX 。 在一些select的例子中,我会得到像72.21.222.155这样的地址。

另外,在以下情况下我没有看到任何区别:

  • 使用-m 255选项运行traceroute (即最大跳数)。

  • 使用-I选项运行traceroute

  • 使用-e选项运行traceroute

  • 使用-p 80-p 25选项运行traceroute

  • 在位于与所述液滴相同的数据中心的不同液滴上运行traceroute

用ping进行诊断

使用ping ,这是一个我可以和不能连接到的网站的运行列表:

可以连接

  • google.com

  • facebook.com

  • reddit.com

  • github.com

  • stackoverflow.com

  • youtube.com

  • twitter.com

无法连接:

  • amazon.com

  • microsoft.com

  • apple.com

  • walmart.com

  • paypal.com

  • cnn.com

  • nyt.org

  • wolframalpha.com

观察:是否有一个原因,我似乎能够连接到具有“社交”function(否则)的网站?

显然,站点不通过ICMP返回应答(这是pingtraceroute使用的)是常见的。 请忽略上述…

其他发现

所以我注意到,如果我修改我的请求以获取额外的“User-Agent”头(下面提供的代码示例),我可以最初获取html响应。

 var request = require('request'); var requestOptions = { url: 'http://www.supremenewyork.com/some/route', headers: {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'} }; request(requestOptions, function(err, res, body) { if (err) { console.log(err); return; } console.log('body:', body); }); 

我实际上能够使用上述方法获得回应几次。 之后,似乎我所有的连接都会导致上述的ETIMEDOUT错误。 那么我得等上一段时间,然后冲洗,洗涤,然后重复。

我实际上对上述(即接收和不接收“用户代理”头部的响应)进行简单的双尾比例testing,得到的p值为0.8493 …因此两者之间没有统计学意义。 再次,请忽略上述…

既然你说他们有问题,并试图防止刮或什么,你可能会受到这些努力。 为什么你需要不断地点击他们的页面?

我认为,如果你真的想要它的工作,你将需要愚弄他们的反铲系统(防火墙或其他)。 因此,您可以尝试在不同的数据中心/城市中使用墨滴,并尝试添加标题以模拟Web浏览器。 用户代理将是我会尝试的第一个。

 var options = { headers: { "user-agent": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"}, url: "www.supremenewyork.com"} 

另外请确保你不要经常打他们的网站,并得到限制。