HTTP/2 主要特点:

  1. 多路复用,代替原来的序列和阻塞机制。所有的并发请求可以通过一个 TCP 连接并发完成。 (HTTP/1.x 发送多个请求会建立多次 TCP 连接,虽然 keep-alive 也可以复用一个连接,但是多个请求是串行有序的,并不能同时请求)
  2. 服务器推送。服务器在发送 HTML 页面时可以主动推送其它的资源(JS/CSS/Image),而不用等浏览器解析 HTML 到对应位置才发请求再响应。
  3. 请求头压缩,减少头部占用的流量。不仅会压缩,还会对后续发起的请求头的头部键值对进行匹配,相同的头部键值对会只用一个字符表示,以此减少头部数据传输量。(HTTP/1.x 也可以通过合并请求、启用 Cookie-Free 域名来缓解这个问题)

启用步骤和过程中遇到的问题:

  1. 没安装的需要先把编译环境装好,也可以使用apt-get安装。pcre的版本最好是8.几的版本,不要高于8,不然到时候会报错。 yum install -y gcc gcc-c++ pcre-devel openssl openssl-devel
  2. 下载nginx源码,启用http2需要nginx的版本为1.9.0以上。这里使用了1.10.2的Stable版本。
    cd /usr/local/src
    wget http://nginx.org/download/nginx-1.10.2.tar.gz
    tar -zxf nginx-1.10.2.tar.gz
    
  3. 下载SSL源码,这里使用LibreSSL(LibreSSL是OpenSSL加密软件库的一个分支,为一个安全套接层(SSL)和传输层安全(TLS)协议的开源实现。在OpenSSL爆出心脏出血安全漏洞之后,一些OpenBSD开发者于2014年4月创立了LibreSSL,目标是重构OpenSSL的代码,以提供一个更安全的替代品。LibreSSL复刻自OpenSSL库的1.0.1g分支,它将遵循其他OpenBSD项目所使用的安全指导原则。)

    cd /usr/local/src
    wget https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/libressl-2.4.2.tar.gz
    tar -xzvf libressl-2.4.2.tar.gz
    
  4. 编译nginx,--with-openssl的路径最好是绝对路径,不然make的时候会报错提示你没有找到.openssl这个目录。

    ./configure --with-openssl=/usr/local/src/libressl-2.4.2 --with-http_v2_module --with-http_ssl_module
    make
    make install
    
  5. 将nginx服务先停止,再把刚刚编译过的文件copy到原来的nginx安装目录,./configure没有指定--prefix的话默认安装在/usr/local/nginx
    nginx -s stop
    cd /usr/local/nginx/sbin
    cp -a nginx /usr/sbin/nginx
    nginx -v
    
    到这里nginx -v输出: nginx version: nginx/1.10.2则表示成功升级了。
  6. 然后再来配置nginx confg, 在listen加上http2即可:
    server {
    listen 443 ssl http2;
    ...
    }
    
    重启一下:nginx -s reload,遇到pid丢失问题执行sudo nginx可以解决。

最后检查是否启用了http2可以使用Chrome查看,在标签栏输入chrome://net-internals/#http2,右侧表格有出现你的网站域名则表示成功了。