![我如何知道实际上终止了 http 响应的原因是什么?](https://linux22.com/image/1554729/%E6%88%91%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E5%AE%9E%E9%99%85%E4%B8%8A%E7%BB%88%E6%AD%A2%E4%BA%86%20http%20%E5%93%8D%E5%BA%94%E7%9A%84%E5%8E%9F%E5%9B%A0%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我有一个提供一些静态文件的 Web 服务器。当服务器负载过重时,它会发送带有 200 HTTP 状态的部分响应。
我的应用程序存在这个问题。为什么?
- 我在响应上设置了缓存标头,目的是长时间保存文件,因为这些文件是静态的并且永远不会改变。
- 有时,一些最终用户只会获取 JavaScript 文件的一部分,其 HTTP 状态为 200。
- 该文件被浏览器缓存,并破坏了我的应用程序!
我尝试了 2 个不同的 Web 服务器(Jetty 和 Apache),发现这两个服务器都出现了这个问题,无论它们前面有没有负载均衡器(haproxy)。这让我认为问题不在于 Web 服务器本身,但这可能是任何 Web 服务器在高负载下的预期行为?
我怎样才能找出导致此问题的原因,或者如何防止此问题发生?
编辑:这些请求也有一个Content-Length
响应标头被提供。
答案1
您需要捕获发生问题的数据包。可能是您的所有东西都运行正常,但最终用户的浏览器存在问题,或者使用了存在问题的 Web 代理、防火墙或 NAT 网关,导致文件被截断。
您可能需要查看服务器/反向代理/负载均衡器在提供该 JS 文件时如何处理 Content-Length 和 Transfer-Encoding 标头。另请查看RFC 7230 第 3.3.2 节“Content-Length”以及以下一些章节。