如果不重启或修改配置,nginx 有时会发送不完整的响应。今天,我可以很好地重现,但仍然不知道问题出在哪里或如何修复。
我将一个 5MB 的文件放到了 nginx 配置使用的站点位置/别名路径中。没有 php5-fpm、模块等。只有 nginx 用于提供静态文件。
测试时,没有其他用户访问服务器,除了我的测试请求之外没有 http 访问。
下载失败,Google Chrome 在流量日志中显示有 2 个请求,尽管我只将下载的 http url 放了一次,并且没有重定向或其他由我自己发起的第二个请求。
服务器的 access.log 也存在同样的问题:
测试1
[2014 年 5 月 14 日: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,如 Gecko)Chrome/32.0.1700.107 Safari/537.36”
[2014 年 5 月 14 日: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,如 Gecko)Chrome/32.0.1700.10
[2014 年 5 月 14 日: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,如 Gecko)Chrome/32.0.1700.107 Safari/537.36”
[2014 年 5 月 14 日: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,如 Gecko)Chrome/32.0.1700.10
您可以看到始终有一个请求的响应大小为 1,另一个请求的响应大小为混合大小,但 >1。但是,浏览器中的结果始终相同。=> 响应损坏,下载失败。
为了确保它与 http 状态/响应 206 无关,我添加max_ranges 0;
到配置并重试 -> test2。
测试2
[2014 年 5 月 14 日: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,如 Gecko)Chrome/32.0.1700.107 Safari/537.36”
[2014 年 5 月 14 日: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,如 Gecko)Chrome/32.0.1700.107 Safari/537.36”
浏览器中的结果相同。下载/请求总是失败,并且 access.log 中的大小总是不同,就像随机块或响应大小一样。
服务器状态:iowait、RAM、cpu基本空闲,无高负载或限制。
这是一个已知问题或错误吗?或者您知道如何解决这个问题吗?
答案1
对于这种简单的情况,我敢肯定您的 nginx 服务器前面有防火墙、IDS/IPS 设备或其他设备,会干扰下载。如有疑问,请联系您的 ISP。