HTTP2.0的技术构架总结 与 Nginx和Tomcat配置HTTP2.0

一、HTTP2.01.1 简介HTTP/2(超文本传输协议第2版 , 最初命名为HTTP 2.0) , 简称为h2(基于TLS/1.2或以上版本的加密连接)或 h2c(非加密连接) , 是HTTP协议的的第二个主要版本 。
1.2 新的特性

具体可以看这篇文章: https://segmentfault.com/a/1190000013420784
  1. 头数据压缩 Data compression of HTTP headers
  2. 服务器推送 HTTP/2 Server Push
  3. 管线化请求 Pipelining of requests.
  4. 对数据传输采用多路复用 , 让多个请求合并在同一 TCP 连接内 Multiplexing multiple requests over a single TCP connection ,  因为每一个tcp 连接在创建的时候都需要耗费资源 , 而且在创建初期 , 传输也是比较慢的 。
  5. 采用了二进制而非明文来打包、传输 客户端<——>服务器 间的数据 。
1.3 h2c 的支持度HTTP/2 的设计本身允许非加密的 HTTP 协议 , 也允许使用 TLS 1.2 或更新版本协议进行加密 。协议本身未要求必须使用加密 , 惟多数客户端 (例如 Firefox, Chrome, Safari, Opera, IE, Edge) 的开发者声明 , 他们只会实现通过TLS加密的HTTP/2协议 , 这使得经 TLS加密的HTTP/2(即h2)成为了事实上的强制标准 , 而 h2c事实上被主流浏览器废弃 。
二、Nginx 对 http2.0 的支持2.1 Nginx 作为服务端使用http2.0
使用 http2.0 的条件
Nginx 版本大于或等于 1.9.5。openssl 版本 等于或者大于OpenSSL 1.0.2编译的时候开启--with-http_v2_module
我们这里配置的 h2  , 因为 浏览器对 h2c 基本不支持 。
Nginx 在 1.9.5 才开始引入 http2.0 ,官方日志 。
编译的时候加入 --with-http_v2_module , 然后在 Nginx 配置中加上 http2
示例
listen 443 ssl http2 default_server;2.2 Nginx 作为客户端使用 http2.0Nginx 作为服务端是可以进行配置 http2.0 的 ,  但是 Nginx 如果作为客户端的话 。Nginx 官方说的是不支持
Q: Will you support HTTP/2 on the upstream side as well, or only support HTTP/2 on the client side?A: At the moment, we only support HTTP/2 on the client side. You can’t configure HTTP/2 with proxy_pass. [Editor – In the original version of this post, this sentence was incorrectly transcribed as “You can configure HTTP/2 with proxy_pass.” We apologize for any confusion this may have caused.]But what is the point of HTTP/2 on the backend side? Because as you can see from the benchmarks, there’s not much benefit in HTTP/2 for low?latency networks such as upstream connections.Also, in NGINX you have the keepalive module, and you can configure a keepalive cache. The main performance benefit of HTTP/2 is to eliminate additional handshakes, but if you do that already with a keepalive cache, you don’t need HTTP/2 on the upstream side.不能使用 proxy_pass配置 http2.0,http2.0性能的主要优势是减少多次tcp连接 , 我们通过配置keepalive也可以做到这点 。(google翻译总结)后续可以了解下 grpc .
grpc_pass grpc://localhost:50051三、Tomcat 对 HTTP2.0 的支持看了下 8.0 版本 ,  是不支持 HTTP2.0。
看了下 8.5版本 ,  是支持 HTTP2.0 。
3.1 、Tomcat 8.5
怕上面文档没有看清 , 下面文中的 h2 指的是(基于TLS/1.2或以上版本的加密连接) , h2c 是非加密的
非加密的 , 用浏览器是访问不了的(因为现在浏览器现在不支持) , 只支持 h2。
官方文档写到
Tomcat 是支持 h2 和 h2c 的 。(你服务端支持没有用啊 , 客户端不支持 , 这不就gg了)
HTTP/2 is support is provided for TLS (h2), non-TLS via HTTP upgrade (h2c) and direct HTTP/2 (h2c) connections. To enable HTTP/2 support for an HTTP connector the following UpgradeProtocol element must be nested within the Connector with a className attribute of org.Apache.coyote.http2.Http2Protocol.<Connector ... ><UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" /></Connector>Because JAVA 8's TLS implementation does not support ALPN (which is required for HTTP/2 over TLS), you must be using an OpenSSL based TLS implementation to enable HTTP/2 support. See the sslImplementationName attribute of the Connector.Additional configuration attributes are available. See the HTTP/2 Upgrade Protocol documentation for details.3.1.1、依赖环境需要安装 openssl 版本大于或者等于1.0.2。
yum installopenssl 3.1.2、h2c 配置(非加密)也就加 <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />


推荐阅读