升级HTTP 2.0历程

21. 5 月 2017 服务器 2

最近服务器频繁受到攻击,挂了一片服务,实不相瞒1G内存小服务器随便一打就倒了,而且我又是那种懒得管的人。。趁这次重新配置了一圈,升级了一下组件,其中就包括nginx升级和http2.0的部署。

HTTP 2.0是由SPDY发展而来的,两者的设计差不多:压缩、多路复用、安全性,但是二者的实现有区别,所以不互相兼容。关于HTTP 2.0的相关技术细节有几篇博文通俗易懂,推荐一下,就不复述了:

HPACK:HTTP/2 头部压缩技术介绍  HPACK完全解析

Negotiation:HTTP/2协议协商机制

另外还有官方文档。不过我是不推荐一上来直接读官方文档的,效率会比较低,但是最后还是要读的……

 

首先要升级https。这一步是必须的,虽然官方并没有说http2需要跟https绑定,但是目前浏览器都是这么干的,所以想要在浏览器上实现http2,网站就必须是https的。

首先需要申请https证书。我看了一些知乎讨论之后尝试了两种:

  1. CheapSSLSecurity的付费版,便宜的一年3刀,限定域名的,对博客来说够用,按页面提示输入信息就可以了,下单后两天一直PENDING状态。。。怒退款。。。
  2. 阿里云的证书服务,提供了免费的DV SSL证书,是Symantec提供的(对这个公司莫名有好感?),也是填入基本信息,十分钟左右就完成了,可以直接在页面下载.pem和.key文件,准备配置服务器了。

Nginx是从1.9版本开始支持http2的,现在最新版本是1.12,但是centos仓库远没有支持到这个版本,需要编译安装。

这里有两行是比较重要的:

首先我用 --with-openssl=/root/openssl-1.1.0e 指定了openssl的源码,这是因为openssl是从1.0.2开始支持ALPN的,而chrome在51版本之后正式放弃NPN使用ALPN,如果不使用新版的openssl,会导致在chrome 51之后的版本上无法使用http2。

另外编译要加入 --with-http_v2_module  (据说默认也会编,我没试,先加上了)

安装完成后,将以前的blog.conf放回到/etc/nginx/conf.d中,blog可以正常访问了。

之后我们在/etc/nginx中新建文件夹key,并把刚才下载的.pem和.key放到这个文件夹里,新建一个blog-https.conf,设置为如下: