前些日子将自己的网站升级为HTTPS,这次再设置支持HTTP2.0。本篇文章不讲述HTTP2的具体原理,但关于HTTP的相关知识会简单讲述一下,关于HTTP2的详细内容可以参看HTTP2基础教程。
队头阻塞
如果仅仅使用一个连接,它需要发起请求、等待响应,之后才能发起下一个请求。在请求应答过程中,如果出现任何状况,剩下所有的工作都会被阻塞在那次请求应答之后。这就是“队头阻塞”,它会阻碍网络传输和Web页面渲染,直至失去响应。为了防止这种问题,现代浏览器会针对单个域名开启6个连接,通过各个连接分别发送请求。它实现了某种程度上的并行,但是每个连接仍会受到“队头阻塞”的影响。
低效的TCP利用
HTTP1并不支持多路复用,TCP协议保证连接都能正常工作,但是不能保证它们的性能是最优的。
臃肿的消息首部
虽然h1提供了压缩被请求内容的机制,但是消息首部却无法压缩。
受限的优先级设置
浏览器能指定优先级的方式是有限的:要么发起请求,要么不发起。浏览器为了先请求优先级高的资源,会推迟请求其他资源。但是优先级高的资源获取之后,在处理的过程中,浏览器并不会发起新的资源请求,所以服务器无法利用这段时间发送优先级低的资源,总的页面下载时间因此延长了。
第三方资源
很多第三方资源都不在Web开发者的控制范围内,所以很可能其中有些资源的性能很差,会延迟甚至阻塞页面渲染。
基础不牢,地动山摇。为了优化HTTP1,开发人员们最大化的发挥了自己的聪明才智。
如Steve Souders这种大牛,写了《高性能网站建设指南》和姊妹篇《高性能网站建设进阶指南》,堪称Web性能科学的奠基之作。
开发人员们也想出了各种实用方案,经常使用的Web性能优化技术有:
还有一些反模式的方案
我们做这一切,不管多么麻烦多么艰辛,主要是为了优化性能,填HTTP1给我们埋的坑,虽然治标不治本。幸运的是,HTTP2来了。
现在让我们看看没有升级前,https://www.asap2me.top/显示的结果
目前环境是:Centos7.6
Web服务:GoLang
Web服务端口号:8080
反向代理:Nginx
系统已经配置好Nginx,也支持HTTPS,关于如何安装Nginx和配置HTTPS可以参考HTTPS配置实战
因为证书已经安装成功,这里主要讲解Nginx如何支持HTTP2。
make install
,否则就是覆盖安装。
curl --http2 -v https://www.asap2me.top -k
2. 使用线上资源 https://myssl.com/http2_check.html
使用HTTP2的性能未必会比HTTP1好,有时候也需要看业务场景。跟其他任何性能调优尝试一样,HTTP2可能也要经历编码、测试、分析以及优化的迭代过程。总体来说通过不断的优化,终会比HTTP1好。
使用ab对http1进行压力测试:
ab -k -c 10 -t 180 -n 10000 https://www.asap2me.top/
ab -k -c 10 -t 180 -n 10000 https://www.asap2me.top/
This is ApacheBench, Version 2.3 <$Revision: 1874286 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking www.asap2me.top (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: nginx/1.12.0
Server Hostname: www.asap2me.top
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128
Server Temp Key: ECDH P-256 256 bits
TLS Server Name: www.asap2me.top
Document Path: /
Document Length: 12 bytes
Concurrency Level: 10
Time taken for tests: 30.967 seconds
Complete requests: 10000
Failed requests: 0
Keep-Alive requests: 9905
Total transferred: 1749525 bytes
HTML transferred: 120000 bytes
Requests per second: 322.93 [#/sec] (mean)
Time per request: 30.967 [ms] (mean)
Time per request: 3.097 [ms] (mean, across all concurrent requests)
Transfer rate: 55.17 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 9.5 0 121
Processing: 25 30 3.0 30 266
Waiting: 25 30 3.0 30 266
Total: 25 31 10.0 30 266
Percentage of the requests served within a certain time (ms)
50% 30
66% 30
75% 31
80% 31
90% 32
95% 33
98% 35
99% 115
100% 266 (longest request)
使用h2load对HTTP2进行压力测试:
h2load -n 10000 -c 6 -T 180 https://www.asap2me.top/
h2load -n 10000 -c 10 -T 180 https://www.asap2me.top/
starting benchmark...
spawning thread #0: 10 total client(s). 10000 total requests
TLS Protocol: TLSv1.2
Cipher: ECDHE-RSA-AES128-GCM-SHA256
Server Temp Key: ECDH P-256 256 bits
Application protocol: h2
progress: 10% done
progress: 20% done
progress: 30% done
progress: 40% done
progress: 50% done
progress: 60% done
progress: 70% done
progress: 80% done
progress: 90% done
progress: 100% done
finished in 31.71s, 315.37 req/s, 27.74KB/s
requests: 10000 total, 10000 started, 10000 done, 10000 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 10000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 879.55KB (900660) total, 585.94KB (600000) headers (space savings 47.37%), 117.19KB (120000) data
min max mean sd +/- sd
time for request: 26.66ms 262.63ms 29.48ms 3.05ms 98.04%
time for connect: 97.46ms 106.95ms 99.53ms 3.16ms 80.00%
time to 1st byte: 127.59ms 141.29ms 130.75ms 4.77ms 80.00%
req/s : 31.54 35.41 33.82 1.14 80.00%
HTTP1.1和HTTP2压测后,在总时间上差别不大,主要是因为测试的接口不合适。不过我们仍能看出,在机器CPU和流量上,HTTP2是有大幅提升的。
将服务升级为支持HTTP2.0,需要考虑如下问题:
写文章的过程中,突然报这个错误,还以为配置的问题,后来发现是需要备案。
大家如果在腾讯云买的域名,备案方法:https://icp-faq.dnspod.cn/why
如果是新的服务,建议一开始就部署HTTP2,对于老的服务,也推荐升级为HTTP2。对于性能测试,推荐一个网站https://www.webpagetest.org/。
写博客是一个好事情,写完这个文章,至少又有几点值得写:
下一篇文章可以写写多路复用的具体实现。
大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)
我的个人博客为:https://shidawuhen.github.io/
往期文章回顾: