HTTP/2 源自 SPDY/2

SPDY 系列协议由谷歌开发,于 2009 年公开。它的设计目标是降低 50% 的页面加载时间。当下很多著名的互联网公司,例如百度、淘宝、UPYUN 都在自己的网站或 APP 中采用了 SPDY 系列协议(当前最新版本是 SPDY/3.1),因为它对性能的提升是显而易见的。主流的浏览器(谷歌、火狐、Opera)也都早已经支持 SPDY,它已经成为了工业标准,HTTP Working-Group 最终决定以 SPDY/2 为基础,开发 HTTP/2。

但是,HTTP/2 跟 SPDY 仍有不同的地方,主要是以下两点:

  1. HTTP/2 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
  2. HTTP/2 消息头的压缩算法采用 HPACK,而非 SPDY 采用的 DEFLATE

HTTP/2 的优势

相比 HTTP/1.x,HTTP/2 在底层传输做了很大的改动和优化:

  1. HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x 的文本格式。二进制格式在协议的解析和优化扩展上带来更多的优势和可能。
  2. HTTP/2 对消息头采用 HPACK 进行压缩传输,能够节省消息头占用的网络的流量。而 HTTP/1.x
  3. 每次请求,都会携带大量冗余头信息,浪费了很多带宽资源。头压缩能够很好的解决该问题。 多路复用,直白的说就是所有的请求都是通过一个 TCP 连接并发完成。HTTP/1.x 虽然通过 pipeline 也能并发请求,但是多个请求之间的响应会被阻塞的,所以 pipeline 至今也没有被普及应用,而 HTTP/2 做到了真正的并发请求。同时,流还支持优先级和流量控制。
  4. Server Push:服务端能够更快的把资源推送给客户端。例如服务端可以主动把 JS 和 CSS 文件推送给客户端,而不需要客户端解析 HTML 再发送这些请求。当客户端需要的时候,它已经在客户端了。 HTTP/2 主要是 HTTP/1.x 在底层传输机制上的完全重构,HTTP/2 是基本兼容 HTTP/1.x 的语义的(详细兼容性说明请戳这里)。Content-Type 仍然是 Content-Type,只不过它不再是文本传输了。

安装openresty前文已经有介绍,本文是基于前文的openresty安装的。查看nginx编译安装时的命令,安装了哪些模块,

/usr/local/openresty/nginx/sbin/nginx -V

然后在其模块后加上

--with-http_v2_module --with-openssl=/root/openssl-1.0.2j

重新编译openresty

wget https://www.openssl.org/source/openssl-1.0.2j.tar.gz
tar -zxvf openssl-1.0.2j.tar.gz
cd openresty-1.11.2.1
./configure --with-luajit --with-http_v2_module --with-http_ssl_module --with-pcre=/root/pcre-8.38 --with-openssl=/root/openssl-1.0.2j
make
不需要make install,直接覆盖即可,具体看以下步骤

直接

service nginx stop

把nginx先停止,然后复制 备份

cp /usr/local/openresty/nginx/sbin/nginx /usr/local/openresty/nginx/sbin/nginx.bak

覆盖

cp /root/openresty-1.11.2.1/build/nginx-1.11.2/objs/nginx /usr/local/openresty/nginx/sbin/

配置server

server {
        listen 443 ssl http2;
        server_name xxxx.com;
        ssl_certificate /path/to/xxx.crt;
        ssl_certificate_key /path/to/xx.key;
        location ~ .php$ {
                proxy_pass http://127.0.0.1:80;
                include naproxy.conf;
        }
        location / {
                try_files $uri @apache;
        }
        location @apache {
                 proxy_pass http://127.0.0.1:80;
                 include naproxy.conf;
        }
}

这是本人的配置,仅供参考,主要是

listen 443 ssl http2;

这部分

测试后重新加载配置

service nginx restart

或者

/usr/local/openresty/nginx/sbin/nginx -s reload

via。https://blog.likeme.top/blog/wp/460.html