nginx 开 HTTP/2 之后,为什么有的客户端反而变慢
给一个纯静态站开 HTTP/2,本来以为会快一点,结果有两台机器上的下载反而慢了半秒。查了两天,结论不太符合直觉。
先说结论:h2 本身没问题,问题在于把它当成提速手段。
这个站一共六个请求:一个 HTML、一个 CSS、一个 favicon、三张小图。HTTP/1.1 下浏览器开六条连接并行拉完;h2 下走一条连接多路复用。请求数这么少,多路复用省下的连接开销本来就有限。
真正的问题在丢包。h2 把并行的流塞进一条 TCP 连接,一旦丢包,所有流一起等重传;h1 的六条连接里丢一条,另外五条还能走。跨洋链路晚高峰丢包 1%–2% 很常见,这时候 h2 的队头阻塞就被放大了。
第二个原因是 TLS。原来没配 session cache,每次新建连接都要完整握手。加上之后:
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets on;
二次访问省掉一个 RTT,比 h2 带来的收益大得多。
所以现在的配置是:h2 开着,但不指望它;重点放在会话复用、gzip,以及把首字节时间压下去。