如何避免外挂Javascript挂起服务器的问题?

我一直有一个奇怪的问题挂在我的负载平衡器服务器运行HAProxy的外部链接Javascript库。 我最近整合了Quantcast监控脚本,工作了大约12个小时,第二天早上我经历了大量的networking连接,如下图所示。 我的负载均衡器后面的所有networking服务器都完全超负荷连接。 我删除了Quantcast的脚本,问题消失了。

我有一些其他分析软件包的问题,​​但从来没有与谷歌分析或Adsense(这两个外部库)的这个问题。 有没有人遇到过这个问题,或者对如何避免这种情况有什么build议?

Netstat图表

你确定这是由JavaScript引起的?

你在哪里粘贴了Quantcast标签? 尝试在页面的最后,就在上面,所以它不会延迟加载其他资源(img,css等)。

如果浏览器不得不等待javascript,那么它会“挂起”,但这只是因为它必须暂停呈现线程才能等待脚本中的document.write。 它不能保持打开端口80的tcp连接,除非有资源加载问题。

该图看起来更像是一个内存不足的问题,如果你运行mpm-prefork,确保MaxClients没有设置得太高,或者你会碰到交换,导致build立了很多连接,但是没有任何服务。 另外,检查http保持活动设置。

我们通常在本地caching外部的JavaScript。 这样你就不必依赖第三方正确的服务JS。 当然,这可能不是一个选项,取决于js正在做什么或dynamic构build。 但是,例如,您可以在本地托pipeGoogle分析的js。

你可以获得一些额外的好处,例如

  1. Gzip – 一些外部的js文件不会被压缩
  2. caching标头 – 你可以设置你的caching头永不过期(处理更新文件名更改)
  3. 更多的控制 – 当然,大个子通常不会引入一个突破性的变化,但有外部链接的JavaScript可能是有风险的。

使用window.onload事件,只有当页面被完全加载(和连接closures)时,才可以追加外部Javascript(使用简单的document.write或DOM构造)。

尝试使用defer属性推迟脚本的运行:

<script src="script.js" type="text/javascript" defer="defer"></script> 

它告诉浏览器在加载页面之前不要考虑脚本。 如果脚本中没有document.write,那么可能会延迟。