本博客开启 HTTP/2 模式

随着 HTTP/2 发布1年多以来,越来越多的浏览器和服务器都开始支持 HTTP/2 了。感觉也是时候该赶一下时髦了,让自己的 Blog 也支持 HTTP/2 了!

因为现在常年使用 Nginx 作为服务前端,所以二话不说搜 Nginx HTTP/2,发现 Nginx 从 1.9.5 就开始支持 HTTP/2 了。查了下 Docker Hub 上最新的 Nginx 镜像,最新的版本是 1.101.11,分别对应 stablemainline,既然 1.9.5 都支持了,没理由 1.10 不支持的,那就选择 1.10 好了。不了解 Nginx 版本规则的,可以点击此处或者参看以下图片:

然后就屁颠屁颠地跑去更新 Nginx 配置文件了,因为据说,只需要在原来 listen 的后面加上 http2 就可以开启 HTTP/2 协议了,类似这样:

1
listen 443 ssl http2

更新一下 Docker 镜像:

1
docker pull nginx:stable

重启一下 Docker 服务,兴冲冲地想要去验证一下 HTTP/2 到底有多爽。然而,Chrome 报告并没有开启 HTTP/2 支持!

Googled around,发现问题症结所在。简单来说,为了更好的玩转 HTTP/2,在 TLS 层面上有两个 extensions,分别是 NPN (Next Protocol Negotiation)ALPN (Application-Layer Protocol Negotiation)NPN 最早被 Google 应用在 SPDY 协议上,后来过渡到了 HTTP/2 上,但是为了大力推广 HTTP/2,Google 决定自废武功,从2016年5月15日起 Chrome 不再支持 NPN。乍一看,也没什么问题,不支持 NPN 还有 ALPN 不是?然而,你这么想就天真了。看一下 OpenSSL 1.0.2 官方发布说明,你会发现,只有从 1.0.2 版本开始,OpenSSL 才开始支持 ALPN。而 Nginx 官方 Docker 镜像使用 Debian Jessie 作为底包其 OpenSSL 最新版本仅支持到 1.0.1t,那就没得玩了,自己编译咯。然而,懒癌晚期发作,Nginx 官方 Docker 镜像还有个 Alpine 版本的,看了下 Dockerfile 和 Alpine 的 package list,觉得有机会,于是乎用 Alpine 版本替换 Debian 版本:

1
docker pull nginx:stable-alpine

重新配置一下 Docker container,启动服务,oh lar~~~

可以看到列表里面已经有本站的地址 tommy.net.cn 了,后面的 h2 表示 HTTP/2,收工。

PS: 在 Chrome 浏览器中输入:chrome://net-internals/ 选择 HTTP/2 便可以查看 HTTP/2 sessions

PPS: 对 HTTP/2 感兴趣的同学,可以阅读MrPeak技术分享HTTP 2.0的那些事,感觉基本上都覆盖到了。