我们有运行 vBulletin 的私人论坛,我们收到过一位客户的投诉,称当他打开大量标签时,访问论坛会很困难。上次他打电话时,发现我们的主机自动屏蔽了他的 IP 地址。在向主机开具支持单后,他们解除了屏蔽,并表示由于连接数过多(我假设是并发连接)而被自动屏蔽。他们说有 546 个连接。
客户正在运行 IE8,并声称在打开大约 8-12 个标签后,其余标签每次都会“超时”。当然,没有其他网站有这个问题。
更新:事实证明 Chrome(或 Firefox,但我认为是 Chrome)有同样的问题。但 Opera 似乎没问题(我猜是因为它的缓存功能很强大)。
由于无法直接访问两端的计算机,我该如何解决这个问题?
答案1
gbroiles 已经有了一个很好的答案;我正在添加一个答案,因为它太长了,无法放在评论中。
全部浏览器打开多个连接以便更快地下载网站。必须下载 HTML 中链接的每个图像、CSS 文件、Javascript 文件等,并且这是并行进行的以加快速度。您可以看到Browserscope.org 的“网络”选项卡中每个浏览器打开了多少个连接。
还有两件事需要注意:
- 趋势是永远不打开浏览器更多的每个主机的连接数。
- 如果连接降级为 HTTP 1.0(由中间代理实现),则大多数浏览器都会打开其他连接。(我能快速找到的最佳链接在这儿;史蒂夫·苏德斯 (Steve Souders) 在他的其中一本书中对此进行了更详细的描述。)
实际上,如果该用户在单个小型 VPS 服务器上打开 10 多个标签,那么他就是在囤积资源。我认为禁止这样做是完全合理的。用户可能会感到不快,但他只有一双眼睛,所以他真的不能声称同时与所有 10 多个页面进行交互。如果服务器是一台大型、功能强大且负载较低的机器,那么当然是另一回事了。
您可以做的一些事情包括:
- 看看你的HTTP Keepalive 设置,然后将其关闭,或将其设置为较低的超时值(例如 5 秒)。这可能还不够,但至少您不会有许多挥之不去的打开连接。
- 在内容分发网络 (CDN)。小型 CDN 帐户现在很便宜,您可以将所有针对静态内容的 HTTP 请求引导出您自己的服务器。
- 验证您的服务器是否为静态内容发送了正确的缓存标头。至少,您不希望用户一遍又一遍地下载相同的徽标、CSS 等。请参阅此很棒的缓存教程, 和在pagetest.org上测试你的标题或者红机器人。
- 弄清楚哪个系统将您的客户列入黑名单。如果它是来自您的 ISP 的反 DDoS 服务,那么也许您可以要求将其排除在反 DDoS 保护之外(但当然首先要考虑这一点)。如果它是主机上的软件防火墙,那么您可以要求提高限制。
简而言之,您应该能够与您的托管合作伙伴一起解决这个问题——但首先要考虑一下潜在的后果。
答案2
听起来您的主机有某种反 DOS 配置设置,而您的客户通过同时打开多个选项卡来触发它。如果访问您系统的单个选项卡同时打开多个 HTTP 会话以并行下载文件,我并不感到惊讶 - 因此,如果您的客户同时打开 10 个选项卡(如较新的浏览器提供的功能),那么听到您的客户打开 10 x 个 HTTP 会话到您的服务器也就不足为奇了。
IE 8 最多可向相同的主机名。
如果您将多个主机名设置为指向同一 IP 的 CNAME(有些人喜欢设置“images.example.com”、“css.example.com”和“forums.example.com”,全部指向同一个实际主机),则可能会使问题变得更糟,因为 IE 很难识别它们都是同一台机器 -显然比较是通过主机名进行的,不是 IP。
您的客户可以通过使用其他浏览器、使用本地缓存来降低发生这种情况的可能性,修改 IE 安装以减少同时会话数或者不要同时加载太多标签页。
您可以要求您的主机增加到您的网络服务器的允许连接数,缩小检测过度使用的时间窗口,或者在您的客户使用可预测的 IP 地址时将您的客户列入白名单。
如果您的主机的防火墙根据同时打开的连接数进行排除,您可能能够通过确保您的配置得到优化来改善这种情况 - 例如,最小化不必要的查询,使用 varnish 或其他类型的加速器查看缓存,打开压缩,确保您允许 HTTP 持久连接。
如果您无法控制建立连接的系统或限制连接的系统,这听起来像是一个很难解决的问题。
答案3
鉴于您无法控制网络浏览器或服务器,您有两个选择。
1) 将网站放在您更能控制的服务器上,从而控制服务器。这会花费您大量的时间和金钱,但您可以获得尽可能多的控制权,只要您愿意支付。Rackspace 云服务器、推荐提供商的 VPS 或优质的共享主机都可以发挥很大作用。您也可以使用托管论坛解决方案,您不会获得太多控制权,但您需要付钱让别人来处理这类事情。
2) 减少请求数量。您可以通过不使用多个 css 或 js 文件、减少图像数量、使用 css sprite 以及最终使用 cdn(或单独的机器)来托管尽可能多的外部图像、javascript 和 css 来实现这一点。您需要能够非常密切地控制您的论坛软件,我从未使用 vBulletin 进行过开发,但这肯定是可行的 - 至少在一定程度上是可行的。