一、HTTP2.01.1 简介HTTP/2(超文本传输协议第2版 , 最初命名为HTTP 2.0) , 简称为h2(基于TLS/1.2或以上版本的加密连接)或 h2c(非加密连接) , 是HTTP协议的的第二个主要版本 。
1.2 新的特性
具体可以看这篇文章: https://segmentfault.com/a/1190000013420784
- 头数据压缩 Data compression of HTTP headers
- 服务器推送 HTTP/2 Server Push
- 管线化请求 Pipelining of requests.
- 对数据传输采用多路复用 , 让多个请求合并在同一 TCP 连接内 Multiplexing multiple requests over a single TCP connection , 因为每一个tcp 连接在创建的时候都需要耗费资源 , 而且在创建初期 , 传输也是比较慢的 。
- 采用了二进制而非明文来打包、传输 客户端<——>服务器 间的数据 。
二、Nginx 对 http2.0 的支持2.1 Nginx 作为服务端使用http2.0
使用 http2.0 的条件Nginx 在 1.9.5 才开始引入 http2.0 ,官方日志 。
Nginx 版本大于或等于 1.9.5。openssl 版本 等于或者大于OpenSSL 1.0.2编译的时候开启--with-http_v2_module
我们这里配置的 h2 , 因为 浏览器对 h2c 基本不支持 。
编译的时候加入 --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" />
推荐阅读
- 为何要清除WordPress网站上的缓存?
- 读网站降权的15个真实原因
- Mac文件误删怎么办?几款不错的数据恢复软件
- 局域网 数据包是如何在以太网中传递的
- 杜仲雄花茶的泡法,金银花茶的功效作用
- 茉莉龙珠的好坏怎么区分,菊花茶的功效有哪些
- 超实用的18个Java8日期处理的实践!建议收藏!
- utf8字符集下的比较规则
- 雪菊花茶功效与作用有哪些,菊花茶的功效有哪些
- 解决跨域的四种方式