由于重定向或服务器资源导致的流量丢失

Traffic loss due to redirection or server resources

我不是 100% 确定这个问题属于这里还是属于 ServerFault,但我会 post 社区希望我提出的问题。我有一个每天处理数千次重定向的网站。我们的许多客户都抱怨他们失去了一些流量。仔细检查代码后,我们推断当我们重定向时流量实际上丢失了:

header("Location: https://samedomain/differentpath/");
exit;

100% 的流量访问了调用这行代码的页面。只有大约 60% 的访问命中 https://samedomain/differentpath.

起初我们以为是服务器问题,所以我们尝试了很多不同的 apache 和 mpm_prefork 设置组合,但都无济于事。这是我们当前的 mpm prefork 配置:

<IfModule mpm_prefork_module>
        StartServers                     5
        MinSpareServers           5
        MaxSpareServers          10
        MaxRequestWorkers         1786
        MaxConnectionsPerChild   0
</IfModule>

经过一些基准测试并发送大量流量后,我注意到当我直接从自己的 IP 发送流量时,发生了 100% 的重定向。这很棒!我可能错了,但至少我可以更有信心服务器可以处理它(我已经在大约 2-3 分钟内进行了 2k 次访问测试)。然后我稍微修改了我的测试以更多地模拟真实流量,所以我得到了一个随机代理列表,这更像我的真实流量,我再次失去了 40% 的流量。而这一切都随着 header 消失了。我 100% 确信在此 header 发生之前不会向响应发送任何其他内容。我们不提供内容,我们只重定向。

为了确保在 header 消失之前我没有遇到响应内容问题,我开始使用元标记进行重定向,JavaScript 重定向,并使用 header 刷新同样的结果。

作为最后一次孤注一掷的尝试,我们用 php FastCGI 启动了 Nginx 服务器。发现同样的问题我并不感到惊讶。

顺便说一句,服务器资源也没有意义,因为我在发送大量流量时查看了进程,它的峰值为 12% CPU 和 4% RAM。以下是服务器的一些详细信息:

Ubuntu 18.04.3 (LTS) x64 6 vCPUs 16GB /320GB 硬盘

我应该提一下,我们的数据库服务器与这台服务器是分开的,并且具有相同的规格。我们还启动了几台服务器并添加了一个负载均衡器,我们得到了(惊喜)相同的结果。

所以我的问题是,知道 header 重定向不是因为内容而失败(我的一些测试我只有重定向但它仍然失败),还有其他可能的原因吗发生?这可能是 apache 问题,还是 php 问题,或者两者兼而有之?

PS: 我也看了所有的错误日志,都是干净的。

编辑:我认为还有一个问题是流量来源。也许代理被我的提供商阻止了,但如果是这样的话,最初的访问也不会访问该页面,对吗?我认为可能有用的另一点信息。

提供 301 重定向是对访问您网站的客户的指示。您不能强迫该访客实际去那里。所以你永远不会得到 100% 的重定向率。也就是说,大多数 human 网络客户端(也称为网络浏览器)的标准行为是遵循该指令并转到 header 响应中提供的目的地。您最有可能遇到的是标准机器人流量。大多数机器人,无论好坏,在面对重定向时都有不同的行为。有时他们会跟随,但更多时候他们不会。您看到大约 40% 的人没有关注,这正好符合互联网上当前机器人程序流量的估计值(估计范围为 40-60%)。

您可能想要分析日志中的 IP 地址和用户代理,以确定它们是否来自已知的机器人,并查看它们所占的百分比。您也可以尝试一个包,该包将 帮助 确定流量并将其记录下来以供测试。例如:https://github.com/JayBizzle/Crawler-Detect 只需了解没有任何检测例程是 100% 准确的。

如果您担心人类访问者没有得到正确的重定向,您可以将内容添加到包含重定向代码的页面并提供一个按钮或 link 以帮助他们到达您尝试访问的页面重定向到。