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