我不是 100% 确定这个问题属于这里还是属于 ServerFault,但我会将它发布到社区希望我发布的地方。我有一个每天处理数千个重定向的网站。我们的许多客户抱怨他们正在失去一些流量。在仔细检查代码后,我们推断当我们重定向时流量实际上正在丢失:
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% 的流量。而这一切都随着标题而丢失了。在此标头出现之前,我 100% 确信没有其他任何内容被发送到响应中。我们不提供内容,我们只重定向。
为了确保在标头出现之前我没有遇到响应内容问题,我开始使用元标记、JavaScript 重定向和标头刷新进行重定向,结果相同。
作为最后的绝望尝试,我们使用 php FastCGI 启动了 Nginx 服务器。发现同样的问题我并不感到惊讶。
顺便说一句,服务器资源也没有意义,因为我在发送大量流量的同时查看了进程,它在 12% 的 CPU 和 4% 的 RAM 时达到峰值。以下是服务器的一些详细信息:
Ubuntu 18.04.3 (LTS) x64 6 个 vCPU 16GB /320GB 磁盘
我应该提一下,我们的数据库服务器与此服务器是分开的,并且具有相同的规格。我们还启动了几台服务器并添加了一个负载均衡器,我们得到了(惊喜)相同的结果。
所以我的问题是,知道标头重定向没有因为内容而失败(我的一些测试我只有重定向但它仍然失败),还有其他可能的原因导致这种情况发生吗?这可能是 apache 问题,还是 php 问题,或两者兼而有之?
PS:我还查看了所有错误日志,它们很干净。
编辑:我认为有问题的其他问题是流量来源。也许代理被我的提供商阻止了,但如果是这种情况,最初的访问也不会点击页面,对吗?只是我认为可能有用的另一点信息。