Nginx 启用 SPDY 后文件下载异常缓慢

Nginx 启用 SPDY 后文件下载异常缓慢

一个完全在 https 上运行的简单 WordPress 静态站点。

Nginx 配置在这里:http://pastebin.com/BrP0LThT

之前和之后唯一的区别是:

listen       443 ssl;
listen       443 ssl spdy;

Nginx 1.8.0 带有 SSL,无 SPDY:

transitions.js 文件的响应:

HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Sun, 28 Jun 2015 18:13:30 GMT
Content-Type: application/javascript
Last-Modified: Wed, 03 Dec 2014 14:19:08 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
ETag: W/"547f1bdc-5267"
Expires: Sun, 12 Jul 2015 18:13:30 GMT
Cache-Control: max-age=1209600
Content-Encoding: gzip

相同的服务器设置,使用 SPDY:

来自同一 js 文件的响应:

HTTP/1.1 200
cache-control: max-age=1209600
content-encoding: gzip
content-type: application/javascript
date: Sun, 28 Jun 2015 18:24:49 GMT
etag: W/"547f1bdc-5267"
expires: Sun, 12 Jul 2015 18:24:49 GMT
last-modified: Wed, 03 Dec 2014 14:19:08 GMT
server: nginx/1.8.0

请注意,一旦启用 SPDY,这些文件的服务器响应会有很大不同。

加载所有内容的总时间几乎完全相同。

事实上,它从一个相当倾斜的瀑布变成了垂直落差,这是可以预料的,可以充分发挥多路复用的作用。

但是这些 js、css 和图像资源上的所有 TTFB 绿条都增加到大约 280 毫秒,并且内容下载时间的蓝条从几乎没有增加到每个超过 1 秒。

详细看这里:

注意统一的 TTFB 延迟约为 280ms

这一切都太过一致,不可能是巧合。

iptables 不建议任何限制。除了启用 SPDY 之外,nginx conf 中也没有任何变化。由于它是 nginx 1.8.0,所以也不是 tcp_nodelay 错误。我的 conf 文件或防火墙中没有特殊的限制配置。keepalive_timeout 为 75,其他 keepalive 选项为默认值。

我应该去哪里找?我可以尝试什么?可能存在什么问题?

由于现在有多达 28 个资源同时下载,带宽可能是一个问题,下面是带宽利用率图表。繁忙的 JS 下载发生在 0.7 秒到 2 秒之间。除了奇怪的急剧下降外,带宽确实达到了最大值(1.5Mbps),因此托管环境可能也对此产生了一些影响。

带宽统计

答案1

我相信您所经历的与 SPDY 的工作方式一致。

在“旧” HTTPS 中,浏览器将以串行方式向服务器发送请求,这就是您在第一个屏幕截图中看到的。

但是,使用 SPDY 时,所有请求都会同时发送,之后服务器会按照其认为最佳的顺序响应文件。这是您在第二个屏幕截图中看到的内容 - 请注意,所有请求的开始时间都相同。

服务器传送请求文件的顺序取决于服务器配置,但更重要的是资源优先级。其理念是尽早发送 JS 和 CSS 文件,以便网站可以绘制。之后,SPDY 应该发送图像和其他资源。

由于您指出 SPDY 和 HTTPS 之间的时间DOMContentLoaded和时间load没有明显差异,因此我认为您的服务器运行正常。如果您想实现更快的绘制时间,请考虑优先级。

资料来源以及非常有趣的进一步阅读材料:

正如下面的评论所述,JayMcTee 发现他的具体情况是由带宽引起的 - 由于 SPDY 同时执行所有请求,因此带宽将更容易被填满,从而导致单个请求比串行执行时更慢。

相关内容