文章信息

浅谈HTTP/2协议在项目中的应用

发布时间:『 2020-01-19 15:30』  文章类别:技术开发  阅读(2637) 评论(0)

    我们在讲这个http的应用之前,先了解一下什么是http。http(Hypertext transfer protocol)超文本传输协议,通过浏览器和服务器进行数据交互,进行文本、图片、视频等传输的规定。http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。

    HTTP 的第一个版本只有GET方法,且没有 HTTP 头文件或状态代码。1996年HTTP/1.0 诞生,其增加了状态代码、POST 和 header 等附加方法。1997 年发布的 HTTP/1.1 引入了一些其它的改进。除了添加像 OPTIONS 这样的方法外,它还引入了 Keep-Alive 头。它允许一个连接对多个 HTTP 请求保持打开状态,性能得到长足提升。

    2013年8月,HTTP/2 发布,在开放互联网上HTTP/2 将只用于https://网址,而 http://网址将继续使用HTTP/1,目的是在开放互联网上增加使用加密技术,以提供强有力的保护去遏制主动攻击。HTTP/2 除了需要启动加密模块,还做了如下一些优化:

    ①解决某些复杂应用程序中的前端阻塞问题:即使使用 HTTP/1.1 进行 6 个并行连接也可能不够用,尤其是当我们遇到前端阻塞时。HTTP/2 通过允许一个连接同时处理多个请求解决了这个问题,这是因为即使其中一个请求被卡住,其它的请求也可以继续,使之性能得到显著提高。

    ②报头压缩:HTTP/2 使用了一种新的报头压缩算法,称之为HPACK。HPACK压缩报头后会更小。

    ③使用服务端推送缓存数据:通过服务器推送,我们现在可以在客户机缓存中填充数据。我们甚至可以在浏览器请求之前完成。示例,当用户访问主页时,它请求 index.html 文件。当它得到一个样式表时,它会注意到还需要style.css 文件。在请求index.html 和style.css 之间有一些延迟。当我们使用服务端推送来处理它时,因为我们知道用户将需要style.css 文件,所以可以将它与index.html 一起发送,而不需要发送另一个请求,大幅提高效率。

    HTTP/2 旨在通过满足日益复杂的 web 页面的需求来提高性能,那么我们在现代互联网的需求下,在实际项目实施过程中该如何实施HTTP/2 ?我们目前使用的热门WEB服务器主要有tomcat和nginx两种,这两种WEB服务器也受到了开发者的深度喜爱。

    ①tomcat目前开源组织支持的版本默认开启的HTTP协议是1.1版本,那么,在tomcat层级实现http2建议使用tomcat9,jdk11。

    首先我们第一步就是将我们的服务升级到https,由于目前我们所有的服务想要支持http2首先得需要支持https,于是我们在阿里云上购买了证书,或者在https://freessl.cn上申请好自己的域名证书,修改server.xml,启用443端口,重启服务,测试访问地址是否能正常访问https的请求,如果访问错误,请检查相关配置是否正确,如能正常访问,那么我们接下来就可以开始进行升级配置了。

    tomcat9为我们提供了jsse upgrade的实现。实际上我们的tomcat8.5也有这个升级的接口,只是它没有实现其中的jsse http2接口,其可以使用openssl接口实现来完成http2,即无法使用简单的配置就能实现http2,需要采用apr协议组件,而apr协议组件在服务器上安装比较麻烦,我们暂且放弃这个方案。使用tomcat9来实现升级基于JSSE SSL/TLS安全套接字的HTTP/2 ,在tomcat9的server.xml已有注释的升级协议配置,事实上只需基于开启的SSL/TLS连接器上增加一行配置即可达成升级后的效果,方便简单又快捷,适合小白进行操作。server.xml连接器参考配置示例(未进行性能配置):

<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol" sslImplementationName="org.apache.tomcat.util.net.openssl.OpenSSLImplementation" maxThreads="150" SSLEnabled="true" defaultSSLHostConfigName="demo.zeal.name">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig hostName="demo.zeal.name">
        <Certificate certificateKeyFile="conf/server.key" certificateFile="conf/ca.crt" type="RSA" />
    </SSLHostConfig>
</Connector>

    ②单实例小系统的实现的方式可以通过配置tomcat来实现。但是,目前很多系统都需进行多实例进行负载均衡高可用性配置,我们升级tomcat的通信协议显然无法满足一部分系统业务的需求,我们深入对nginx的研究,对于目前发布的版本nginx配置http2是一件很简单的事。对于linux server来说,在安装nginx时需要增加--with-http_ssl_module --with-http_v2_module 两个模块;对于windows server来说,ssl和http2模块默认已安装了,我们直接修改配置文件nginx.conf,在配置文件中开启443端口,reload nginx服务即可。nginx.conf的服务配置示例(未进行性能配置):

server {
    listen       443 ssl http2;
    server_name  demo.zeal.name;
		
    proxy_set_header Host               $host;
    proxy_set_header X-Real-IP          $remote_addr;
    proxy_set_header X-Forwarded-For 	$proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto  $scheme;
		
    ssl_certificate     demo.zeal.name_chain.crt;
    ssl_certificate_key demo.zeal.name.key;

    ssl_session_cache    	shared:SSL:1m;
    ssl_session_timeout  	5m;
    ssl_ciphers 		ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!3DES:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols 		TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers  on;

    location / {
        proxy_pass http://demo.zeal.name;
        index  index.html index.htm;
    }
		
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
        root static;
    }
}

    其他注意事项:①作为WEB服务器,我们启用了新的端口,那需要对服务器配置对外开放新的端口443。②由于http请求采用的HTTP/1.1 ,我们建议将WEB服务的http 301自动重定向到HTTP/2 https。③如果我们采用nginx+tomcat服务器组合开启https,tomcat的配置server.xml中的Host下需增加HTTPS代理配置,增加配置示例如下:

<Valve className="org.apache.catalina.valves.RemoteIpValve"  
				remoteIpHeader="X-Forwarded-For"  
				protocolHeader="X-Forwarded-Proto"  
				protocolHeaderHttpsValue="https"/>


关键字:  http  http2  https  tomcat  nginx
评论信息
暂无评论
发表评论
验证码: 
当前时间
小主信息

愿历尽千帆,归来仍少年。
3D标签云

Anything in here will be replaced on browsers that support the canvas element

友情链接

Copyright ©2017-2024 uzen.zone
湘ICP备17013178号-3