Fundebug网站升级HTTP/2,真的变快了!

news/2024/5/20 12:28:44/文章来源:https://fundebug.blog.csdn.net/article/details/102778147

作为新一代的HTTP协议,HTTP/2可以提高网站性能,优化用户体验,Fundebug也是时候升级HTTP/2了,虽然已经有点晚了。

升级HTTP/2是一件很简单的事情,改1行Nginx配置就好了,但是,工程师只知道How是远远不够的,还需要理解Why,这就要求我们需要足够的事先调研(1. 什么是HTTP/2?)以及事后分析(4. 升级HTTP/2真的提高性能了吗?)。

1. 什么是HTTP/2?

HTTP/2是新一代的HTTP协议,于2015正式发布。

与其他众多Web技术标准一样,推动HTTP/2标准的依然是Google。发布Chrome的时候Google说过要推动Web技术的发展,然后它真的做到了。(JavaScript深入浅出第5课:Chrome是如何成功的?)

根据W3Techs的统计,截止2019年10月26日,全世界41.3%的网站已经使用了HTTP/2。

根据Can I use,绝大多数浏览器都支持了HTTP/2:

HTTP/2主要有以下几个特性:

  • HTTP/2为二进制协议


图片来源:Valentin V. Bartenev

由上图可知,HTTP/1.1传输的是文本数据,而HTTP/2传输的是二进制数据,提高了数据传输效率。

  • HTTP/2支持TCP连接多路复用


图片来源:Factory.hr

由上图可知,HTTP 1.1需要为不同的HTTP请求建立单独的TCP连接,而HTTP/2的多个HTTP请求可以复用同一个TCP连接。

要知道,建立TCP连接时需要3次握手,再加上TLS的4次握手,加起来就是7次握手,如果可以复用TCP连接的话,则可以减少这些多余的开销。

  • HTTP/2会压缩请求Header


图片来源:运维实谈

如上图所示,第2个请求的Header只有:path不一样,因此压缩空间非常可观。

Headers压缩的算法HPACK本身似乎很复杂(其实也不难),但是算法思想其实非常简单的,假设我们在浏览器发起100个请求,它们的user-agent是不会变的,那我们为什么需要重复传输这个长长的字符串呢?用dictionary记录一次不就行了!

  • HTTP/2支持服务器推送(Server Push)

图片来源:lujjjh

由上图可知,当客服端向服务端请求HTML时,Server Push服务端可以提前返回HTML所依赖的css、js等资源,这样可以节省解析HTML以及请求资源的时间,从而缩短页面的加载时间。

2. 如何升级HTTP/2?

我们使用了Nginx作为前端页面与后端接口的反向代理服务器(Reverse Proxy),只需要修改一下Nginx配置文件就可以升级HTTP/2了,非常简单。

注意,在 Nginx 上 开启 HTTP/2 需要 Nginx 1.9.5 以上版本(包括1.9.5),并且需要 OpenSSL 1.0.2 以上版本(包括1.0.2)。使用nginx -V命令可以查看Nginx的版本信息:

nginx -V
nginx version: nginx/1.12.1
built by gcc 6.3.0 20170516 (Debian 6.3.0-18)
built with OpenSSL 1.1.0f  25 May 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin3-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.12.1/debian/debuild-base/nginx-1.12.1=. -specs=/usr/share/dpkg/no-pie-compile.specs -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-specs=/usr/share/dpkg/no-pie-link.specs -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie'

可知,我们使用的Nginx版本为1.12.1,OpenSSL版本为1.1.0f,符合要求。

还有一点,虽然HTTP/2标准并没有要求加密,但是所有浏览器都要求HTTP/2必须加密,这样的话,只有HTTPS才能升级HTTP/2。

如果你还没用过HTTPS的话,不妨看看我的博客:教你快速撸一个免费HTTPS证书,其实也很简单。

一切前提没问题的话(Nginx>=1.9.5,OpenSSL>=1.0.2,HTTPS),只需要修改1行配置,在listen指令后面添加http2:

server
{listen 443 ssl http2;server_name www.fundebug.com;
}

重启Nginx,升级HTTP/2就成功了,可以使用curl命令检查:

curl -sI https://www.fundebug.com
HTTP/2 200
server: nginx/1.12.1
date: Mon, 07 Oct 2019 00:12:53 GMT
content-type: text/html; charset=UTF-8
content-length: 4892
x-powered-by: Express
accept-ranges: bytes
cache-control: public, max-age=0
last-modified: Sun, 06 Oct 2019 23:07:25 GMT
etag: W/"131c-16da353dbc8"
vary: Accept-Encoding
strict-transport-security: max-age=15768001

3. HTTP/2导致Safari浏览器OPTIONS请求失败

升级HTTP/2之后,使用Safari的用户发现无法登陆Fundebug了:

我们的前端异常监控插件捕获了这个报错:

可知,是**/api/members/login**接口出错了。

经过排查发现是OPTIONS请求失败了:

curl -X OPTIONS https://api.fundebug.com/api/members/login -v
*   Trying 120.77.45.162...
* TCP_NODELAY set
* Connected to api.fundebug.com (120.77.45.162) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pemCApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS change cipher, Client hello (1):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=api.fundebug.com
*  start date: Sep 15 16:38:43 2019 GMT
*  expire date: Dec 14 16:38:43 2019 GMT
*  subjectAltName: host "api.fundebug.com" matched cert's "api.fundebug.com"
*  issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7fcfbb80ce00)
> OPTIONS /api/members/login HTTP/2
> Host: api.fundebug.com
> User-Agent: curl/7.54.0
> Accept: */*
>
* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
* http2 error: Invalid HTTP header field was received: frame type: 1, stream: 1, name: [content-length], value: [0]
* HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)
* Closing connection 0
* TLSv1.2 (OUT), TLS alert, Client hello (1):
curl: (92) HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)

根据curl的报错信息,可知是Header中content-length有问题:

* http2 error: Invalid HTTP header field was received: frame type: 1, stream: 1, name: [content-length], value: [0]

将Nginx配置文件中OPTIONS请求的Content-Length配置注释掉,问题就解决了:

if ($request_method = "OPTIONS")
{add_header Access-Control-Allow-Origin *;add_header 'Access-Control-Max-Age' 86400;add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, OPTIONS, DELETE';add_header 'Access-Control-Allow-Headers' 'token, reqid, nid, host, x-real-ip, x-forwarded-ip, event-type, event-id, accept, content-type';# add_header 'Content-Length' 0; // 必须注释,否则HTTP/2会报错add_header 'Content-Type' 'text/plain, charset=utf-8';return 200;
}

HTTP/2中对于Header有特殊处理,这应该是导致出错的根本原因,关于这一个问题,我会在下一篇博客中详细介绍。

4. 升级HTTP/2真的提高性能了吗?

理论上来说,HTTP/2应该可以提高网站性能,但是实际情况是怎样呢?HTTP/2真的可以提高性能了吗?如果有的话,究竟提高了多少呢?

于是,我使用Chrome记录了升级HTTP/2前后Fundebug首页的加载时间,计算了5次加载的平均时间(单位为妙),如下表:

HTTP版本DOMContentLoadedLoadFinish
HTTP/1.11.5724.3425.138
HTTP/21.00044.1024.288

可知,HTTP/2明显提高了首页加载时间,DOMContentLoaded、Load与Finish时间均有明显提高。

一共也就改了2行Nginx配置,就可以提高页面访问性能,多好啊!

参考

  • Module ngx_http_v2_module
  • HTTP/2 Frequently Asked Questions
  • HTTP的前世今生
  • The HTTP/2 Module in NGINX
  • HTTP/2: the difference between HTTP/1.1, benefits and how to use it
  • HPACK: the silent killer (feature) of HTTP/2
  • 浅谈 HTTP/2 Server Push

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_734284.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

来,了解一下90年代的网站

来自:www.sohu.com/a/240853435_66877020 年对于互联网来说是很长的一段时间,网页设计在此期间也走过了很长的路,我们现在回头看,几乎不敢相信我们曾经设计过这种东西!▎1. Penny JuicePenny Juice 是一款为儿童制作的…

网站 HTTP 升级 HTTPS 完全配置手册

作者:葡萄城技术团队链接:https://my.oschina.net/powertoolsteam/blog/1862967昨天,所有使用Google Chrome稳定版的用户迎来了v68正式版首个版本的发布,详细版本号为v68.0.3440.75,上一个正式版v67.0.3396.99发布于6月…

底层小程序员 练手做一个网站不小心赚了几十亿

微信又改版了,为了方便第一时间看到我们的推送,请按照下列操作,设置“置顶”:点击上方蓝色字体“程序员之家”-点击右上角“…”-点击“设为星标”。可以啦,让我们继续相互陪伴。人们都说互联网是个神奇的领域&#xf…

8个程序员专用软件/网站,个个是神器,第一个最惊喜......

微信又改版了,为了方便第一时间看到我们的推送,请按照下列操作,设置“置顶”:点击上方蓝色字体“程序员之家”-点击右上角“…”-点击“设为星标”。可以啦,让我们继续相互陪伴。节省时间的方法有俩,一个是…

相亲网站男生都是一个人,单身程序员惊现神操作!!

微信又改版了,为了方便第一时间看到我们的推送,请按照下列操作,设置“置顶”:点击上方蓝色字体“程序员之家”-点击右上角“…”-点击“设为星标”。可以啦,让我们继续相互陪伴。话说,今年还有不到一个月就…

程序员不能忍996了!没有X生活,生病ICU,发起抗议网站,GitHub一小时破千星

本文转载自【量子位 】 公众号 【QbitAI】继女装大佬图片分享,割韭菜大佬卖鸡汤之后,GitHub又有了新功能:控诉互联网公司侵权行为。原来,是有人注册了一个叫做996.icu的域名,并且在这个网站上大举控诉部分互联网公司实…

程序员不能忍996了!发起抗议网站,GitHub一小时破千星

继女装大佬图片分享,割韭菜大佬卖鸡汤之后,GitHub又有了新功能: 控诉互联网公司侵权行为。 原来,是有人注册了一个叫做996.icu的域名,并且在这个网站上大举控诉部分互联网公司实行996工作制的行为。 并且&#xff0…

程序员免费学习编程的5个网站,你知道几个?

学习编程虽然说门槛不高,但是对于很多喜欢编程,却不知道从何处入手的小伙伴来说,也是一件苦差事。 不可否认编程是非常有价值的技能,当然也是应此前不少粉丝的要求,在这里就给大家推荐几个免费学习编程的好地方。 1、麻…

推荐11个免费学编程的好网站,还有200G书籍软件无门槛领取

今天给大家推荐11个可以免费学习编程的网站,希望大家哪怕找到一个自己合适的,然后好好利用起来,那么必将会有长足的进步。 11. Codecademy Codecademy的大名相信大家都听过,这个就不多介绍了,免费课程很多很全面。大…

这4个网站堪称效率神器,让你的工作效率甩别人10条街!

拷贝兔 https://cp.ifval.com/ 一款轻量级的 Web 跨平台文件、文字分享工具,支持Mac,Windows,Android,Linux,iOS互传,让你在不同的设备间进行文件传输,而不需要安装任何软件。 Toolfk https:…

推荐11个免费学编程的好网站,还有200G书籍软件无门槛领取

推荐11个免费学编程的好网站。 今天给大家推荐11个可以免费学习编程的网站,希望大家哪怕找到一个自己合适的,然后好好利用起来,那么必将会有长足的进步。 11. Codecademy Codecademy的大名相信大家都听过,这个就不多介绍了&#…

将APP发布到各大官方网站的方法,如华为、360手机助手、小米等

1、发布华为官网的方法: (1)登录华为开发者联盟网站:http://developer.huawei.com/consumer/cn (2)注册自己的账号、注册成功后,点击账号设置--我的产品--即可发布apk,华为是我了解…

in index.php line 69,wordpress首页出现index.php on line 45 - 搜外SEO问答

Warning: Invalid argument supplied for foreach() in /www/wwwroot/b.com/wp-content/themes/Luss_1.22/index.php on line 45如下图:就改了一下网站通知,突然就变这个样子了,尴尬!index.php文件如下:if( _hui(ads_i…

php mysql 网站性能分析工具_windows+php+apache+mysql+xhprof+图文配置性能分析工具

ApacheApache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。PHPPHP,是英文超级文本预处理语言Hypertext Preprocessor的缩写。PHP 是一种…

由于您访问的url有可能对网站造成安全威胁_「网络安全」安全设备篇(防火墙、IDS、IPS的区别-UTM-WAF)...

「网络安全」安全设备篇(4)——防火墙、IDS、IPS的区别简介:前面三篇文章,针对防火墙、IDS、IPS做了详细介绍,具体内容这里不再赘述,感兴趣的小伙伴可以去看看哦。概念不同防火墙和IPS属于访问控制类产品,而IDS属于审计类产品。我…

如何使用sleep study报告_亚马逊网站测评报告如何购买和使用 Gift Card

1.登录美国亚马逊账号 。首先你要有亚马逊的注册账号。登录后,您可以进入礼品卡购买页面 。有三种礼品卡 可以购买 。2.通过电子邮件购买虚拟礼品卡 。礼品卡可以通过两种渠道购买(即时送货和免费一天送货 ),我们选择通过电子邮件发送。因为其他卡都是物…

如何在线把网站html生成xml文件_谷歌SEO-外贸网站地图制作和提交教程

谷歌SEO中,制作和提交外贸网站站点地图有利于谷歌更好的了解网站结构。站点地图会告诉谷歌搜索引擎网站中的哪些文件比较重要,还会提供与这些文件有关的重要信息:例如,对于网页,这些信息包括网页上次更新的时间、网页更…

jsp模糊查询查不到_查询知识产权和商标专利的网站汇总!

知识产权:1.大陆知识产权网站http://202.127.48.148/zscq/search/jsp/vBrandSearchIndex.jsp根据查询条件,可以采取模糊查询和精确查询两种方式!2.香港知识产权网址https://esearch.ipd.gov.hk/nis-pos-view/可以检索商标专利以及外观&#x…

关键词提取_提取关键词,快速提高SEO排名和成果

网站优化离不开关键词。用户可以通过关键词接收我们的网站。seo关键词优化如何提取关键词,使网站seo效果倍增?在百度搜索相关信息时,通常会在百度输入一些关键词。搜索引擎根据这些关键词在数据库中搜索,根据关键词的匹配程度、位…

linux网站路径,linux系统网站文件的路径是怎样的?请问 – 手机爱问

2013-08-23如何通过密码保护Linux上的文1。打开终端。输入”su”(没有引号)2。接下来会要你输入密码,输入你的root密码。3。假设我的文件夹在主目录里,地址为 /var/home/dengchao/cc 。假设我要修改文件权限为777,则在终端输入 chmod 777 /va…