启用 HTTP2 升级 Nginx 记录

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 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,右侧表格有出现你的网站域名则表示成功了。