您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

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

时间:2020-03-31 10:29:14  来源:  作者:

一、HTTP2.0

1.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.0

Nginx 作为服务端是可以进行配置 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 install  openssl 

3.1.2、h2c 配置(非加密)

也就加 <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />

示例配置

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150">
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>

日志中可以看到

The ["http-nio-8080"] connector has been configured to support HTTP upgrade to [h2c]

也就意味着 h2c 配置好了。

我们进行测试,使用的是curl, 但是这个 需要最新的版本,具体可以看扩展内容。

# curl --http2  http://192.168.174.128:8080
# tomcat 日志 
192.168.174.128 - - [26/Mar/2020:09:54:28 +0800] "GET / HTTP/1.1" 101 -  
192.168.174.128 - - [26/Mar/2020:09:54:28 +0800] "GET / HTTP/2.0" 200 11195
# 101 是转换协议,也就是 转为协议为 http2.0 . 第二条日志也就证实了。

3.1.3、h2 配置(加密)

也就意味着要进行配置证书了,

这个是8.5.53 版本的默认配置

    <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
         This connector uses the APR/native implementation which always uses
         OpenSSL for TLS.
         Either JSSE or OpenSSL style configuration may be used. OpenSSL style
         configuration is used below.
    -->
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
               maxThreads="150" SSLEnabled="true" >
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateKeyFile="conf/localhost-rsa-key.pem"
                         certificateFile="conf/localhost-rsa-cert.pem"
                         certificateChainFile="conf/localhost-rsa-chain.pem"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>

示例配置

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" >
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
       <SSLHostConfig>
            <Certificate certificateKeyFile="conf/server.key"
                         certificateFile="conf/ca.crt"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>

配置成功日志

The ["https-openssl-nio-8443"] connector has been configured to support negotiation to [h2] via ALPN

访问

 curl  --http2 -k   https://192.168.174.128:8443
 # 查看 tomcat 的 localhost_access_log 日志
 192.168.174.128 - - [26/Mar/2020:10:36:03 +0800] "GET / HTTP/2.0" 200 11195

发现 OK。

浏览器进行访问,也是ok。

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

 

四、扩展

4.1、测试 h2c

需要安装 curl ,curl 新版本的才支持,老版本不支持 http2.0.

rpm -ivh http://mirror.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-2-1.rhel7.noarch.rpm
yum clean all
yum makecache
yum update curl   --enablerepo=city-fan.org
# 可以看到 http2.0 就意味着支持了。
curl  -V
curl 7.69.1 (x86_64-redhat-linux-gnu) libcurl/7.69.1 NSS/3.44 zlib/1.2.7 libpsl/0.7.0 (+libicu/50.1.2) libssh2/1.9.0 nghttp2/1.31.1
Release-Date: 2020-03-11
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz Metalink NTLM NTLM_WB PSL SPNEGO SSL UnixSockets

4.2、查看浏览器是否支持 http2.0

查看我们的浏览器是否支持 http2.0, 打开网址进行测试。

4.3、查看网站是否支持 http2.0

网址, 需要越墙。

4.4、JAVA8 如何支持 HTTP2.0 TLS

问题

  1. java8 的 TLS 不支持 ALPN(http2.0 TLS 需要ALPN)# http://tomcat.apache.org/tomcat-8.5-doc/config/http.html#HTTP/2_Support 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. java8 的 TLS 不支持 ALPN(http2.0 TLS 需要ALPN),我们必须基于 OpenSSL的TLS实现来启用HTTP/2支持。
  2. 默认使用 org.apache.tomcat.util.net.jsse.JSSEImplementation,但在 Java8 情况下不支持 ALPN。# http://tomcat.apache.org/tomcat-8.5-doc/config/http.html#HTTP/2_Support When APR/native is enabled, the connectors will default to using OpenSSL through JSSE, which may be more optimized than the JSSE Java implementation depending on the processor being used, and can be complemented with many commercial accelerator components. The following NIO and NIO2 SSL configuration attributes are not specific to a virtual host and, therefore, must be configured on the connector. 也就是说当 APR/native 开启了, 连接器会默认使用 OpenSSL

解决

方法一(没行通)

我们需要关注这个参数:sslImplementationName

sslImplementationName	
The class name of the SSL implementation to use. If not specified and the tomcat-native library is not installed, the default of org.apache.tomcat.util.net.jsse.JSSEImplementation will be used which wraps JVM's default JSSE provider. Note that the JVM can be configured to use a different JSSE provider as the default. Tomcat also bundles a special SSL implementation for JSSE that is backed by OpenSSL. To enable it, the native library should be enabled as if intending to use the APR connector, and Tomcat will automatically enable it and the default value of this attribute becomes org.apache.tomcat.util.net.openssl.OpenSSLImplementation. In that case, the attributes from either JSSE and OpenSSL configuration styles can be used, as long as the two types are not mixed (for example, it is not allowed to define use of a Java keystore and specify a separate pem private key using the OpenSSL attribute).

当我们没有安装 tomcat-native ,将默认使用 org.apache.tomcat.util.net.jsse.JSSEImplementation,但是这个是不支持 ALPN,也就不支持 http2.0了。

看官方说到我可以配置 sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation" ,但是我进行配置这个启动就失败了

	org.apache.catalina.LifecycleException: 初始化组件[Connector[HTTP/1.1-8443]]失败。
		at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
		at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:139)
		at org.apache.catalina.core.StandardService.initInternal(StandardService.java:552)
		at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
		at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:848)
		at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136)
		at org.apache.catalina.startup.Catalina.load(Catalina.java:639)
		at org.apache.catalina.startup.Catalina.load(Catalina.java:662)
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.lang.reflect.Method.invoke(Method.java:498)
		at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:303)
		at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473)
	Caused by: java.lang.UnsatisfiedLinkError: org.apache.tomcat.jni.Pool.create(J)J
		at org.apache.tomcat.jni.Pool.create(Native Method)

方法二(可行)

安装 tomcat-native,只要本地安装了 tomcat-native ,就会默认使用 openssl. 虽然我们没有开启 ARP

yum install   openssl   tomcat-native  -y

Tomcat 开启ARP 文章

因此我建议,你在 java 8的 环境下需要使用 h2 的话,需要做到以下几点

  1. 安装 openssl 大于等于 1.0.2。
  2. 使用 Tomcat 8.5
  3. 安装 tomcat-native。


Tags:HTTP2.0   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
HTTP缓存策略http协议是什么?HTTP协议(超文本传输协议),简单来说就是一种网络传输协议, 浏览器请求服务器获取内容就是基于http协议或者https协议。 使得计算机可以在浏览器和服...【详细内容】
2020-08-06  Tags: HTTP2.0  点击:(69)  评论:(0)  加入收藏
一、HTTP2.01.1 简介HTTP/2(超文本传输协议第2版,最初命名为HTTP 2.0),简称为h2(基于TLS/1.2或以上版本的加密连接)或 h2c(非加密连接),是HTTP协议的的第二个主要版本。1.2 新的特性...【详细内容】
2020-03-31  Tags: HTTP2.0  点击:(62)  评论:(0)  加入收藏
前言引入任何一种新技术都是有原因和目的的。比如 HTTP keep-alive 允许客户端和服务端用同一个 TCP 连接发送/接收多个请求/响应,减少了昂贵的 TCP 建立连接和断开连接的过...【详细内容】
2019-12-19  Tags: HTTP2.0  点击:(111)  评论:(0)  加入收藏
前言引入任何一种新技术都是有原因和目的的。比如 HTTP keep-alive 允许客户端和服务端用同一个 TCP 连接发送/接收多个请求/响应,减少了昂贵的 TCP 建立连接和断开连接的过...【详细内容】
2019-09-05  Tags: HTTP2.0  点击:(214)  评论:(0)  加入收藏
摘要: 本文由阿里视频云高级技术专家空见撰写,主要介绍HTTP2.0的历史、特性、如何使用和使用之后的性能对比验证。背景介绍要了解HTTP2.0,先了解一下HTTP超文本传输协议的历史(H...【详细内容】
2019-06-19  Tags: HTTP2.0  点击:(388)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(5)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(9)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(21)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(17)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(17)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条