一个完全在 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 秒。
详细看这里:
这一切都太过一致,不可能是巧合。
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
没有明显差异,因此我认为您的服务器运行正常。如果您想实现更快的绘制时间,请考虑优先级。
资料来源以及非常有趣的进一步阅读材料:
- http://www.webpagetest.org/forums/showthread.php?tid=13485
- https://thethemefoundry.com/blog/why-we-dont-use-a-cdn-spdy-ssl/
- https://insouciant.org/tech/prioritization-is-critical-to-spdy/
正如下面的评论所述,JayMcTee 发现他的具体情况是由带宽引起的 - 由于 SPDY 同时执行所有请求,因此带宽将更容易被填满,从而导致单个请求比串行执行时更慢。