我遇到了一个奇怪的问题,外部链接的 Javascript 库挂起了运行 HAProxy 的负载均衡器服务器。我最近集成了 Quantcast 监控脚本,它工作了大约 12 个小时,第二天早上,我遇到了大量网络连接挂起的情况,如下图所示。我的负载均衡器后面的所有 Web 服务器也完全被连接超载了。我删除了 Quantcast 的脚本,问题就消失了。
我在使用其他一些分析软件包时也遇到过这个问题,但从未在使用 Google Analytics 或 Adsense(均为外部库)时遇到过这个问题。有人遇到过这种情况吗?或者有人能建议如何避免这种情况发生吗?
答案1
你确定这是由 javascript 引起的吗?
您将 quantcast 标签粘贴到了哪里?尝试将其粘贴到页面末尾,就在上方,这样就不会延迟其他资源(img、css 等)的加载。
如果浏览器必须等待 javascript,它确实会“挂起”,但那只是因为它必须暂停渲染线程以等待脚本中的 document.write。它无法保持与端口 80 的 TCP 连接打开,除非您遇到资源加载问题。
该图看起来更像是内存不足问题,如果您运行 mpm-prefork,请确保 MaxClients 设置不要太高,否则您会遇到交换问题,导致建立大量连接但什么都没有提供。另外,请检查 http keepalive 设置。
答案2
我们通常在本地缓存外部 javascript。这样您就不必依赖第三方正确地提供 JS。当然,这可能不是一个选项,具体取决于 js 正在做什么或它是否动态构建。但您可以例如在本地托管 google analytic 的 js。
这样做还可以获得一些额外的好处,例如
- Gzip - 一些外部 js 文件不会被压缩
- 缓存标头 - 您可以将缓存标头设置为永不过期(处理文件名更改的更新)
- 更多的控制 - 当然,大公司一般不会引入重大变化,但拥有外部链接的 javascript 可能会有风险。
答案3
使用 window.onload 事件,您仅可以在页面完全加载(并且连接关闭)时附加外部 Javascript(使用简单的 document.write 或 DOM 构造)。
答案4
尝试使用 defer 属性推迟脚本的运行:
<script src="script.js" type="text/javascript" defer="defer"></script>
它告诉浏览器在页面加载完成之前不要考虑脚本。如果脚本中没有 document.write,则可能可以推迟。