nginx 发送不完整的响应

led*_*edy 5 configuration nginx

如果不重新启动或修改配置,nginx 有时会发送不完整的响应。今天,我可以很好地重现,但仍然不知道出了什么问题或如何修复。

我将一个 5MB 文件放入 nginx 配置使用的站点位置/别名路径。没有 php5-fpm、模块等,只有 nginx 来提供静态文件。

测试时,没有其他用户访问服务器,除了我的测试请求之外,没有http访问。

下载失败,Google Chrome 在流量日志中显示有 2 个请求,尽管我只输入了一次下载的 http url,并且没有由我自己发起的重定向或其他第二个请求。

服务器的 access.log 也有同样的问题:

测试1

[14/May/2014:14:06:53 +0200]“GET /dev/test_test.m4v HTTP/1.1”206 1“-”“Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,例如壁虎)Chrome/32.0.1700.107 Safari/537.36"

[14/May/2014:14:06:53 +0200]“GET /dev/test_test.m4v HTTP/1.1”200 130680“-”“Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,例如壁虎)铬/32.0.1700.10

[14/May/2014:14:07:15 +0200]“GET /dev/test_test.m4v HTTP/1.1”206 1“-”“Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,例如壁虎)Chrome/32.0.1700.107 Safari/537.36"

[14/May/2014:14:07:15 +0200]“GET /dev/test_test.m4v HTTP/1.1”200 114684“-”“Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,例如壁虎)铬/32.0.1700.10

您可以看到,始终有一个请求的响应大小=1,而另一个请求的响应大小为混合大小,但>1。然而,浏览器中的结果始终是相同的。=> 响应中断,下载失败。

为了确保它与 http status/response 206 无关,我将其添加max_ranges 0;到配置中并重试 -> test2。

测试2

[14/May/2014:14:11:36 +0200]“GET /dev/test_test.m4v HTTP/1.1”200 152460“-”“Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,例如壁虎)Chrome/32.0.1700.107 Safari/537.36"

[14/May/2014:14:11:38 +0200]“GET /dev/test_test.m4v HTTP/1.1”200 142296“-”“Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,例如壁虎)Chrome/32.0.1700.107 Safari/537.36"

在浏览器中的结果相同。下载/请求总是失败,并且 access.log 中的大小总是不同,例如随机块或响应大小。

服务器状态:iowait、RAM、CPU 几乎空闲。没有高负载或限制。

这是一个已知问题或错误吗?或者您知道如何解决这个问题吗?

Jan*_*nen 1

对于这样简单的场景,我很确定您的 nginx 服务器前面有防火墙、IDS/IPS 设备或其他东西会干扰下载。如有疑问,请联系您的 ISP。

  • 我可以再次确认,这不是防火墙或客户端错误。这是服务器造成的。我们注意到的另一个事实。似乎只有 Chrome 浏览器有问题。火狐从来没有遇到过这个问题。使用 chrome,有时会得到空响应;其他时候,相同的请求会成功,没有任何问题。我将在顶部的问题描述中添加进一步的日志记录。 (2认同)