前言
HTTP/2 RFC 出了至今已经有4年,然后好像还没有普及的样子。根据分析,截止2019.10只有41%的网站启用了 HTTP/2,当然我这破博客也没用上,连 HTTPS 都没用上。我又看了一下,我司自己网站和百度也没用上 HTTP/2,然而 HTTP/3 在2019.09.26好像已经确定了,使用的是 QUIC 方案。
因在上一篇的测试中发现 Http Header 在整个 Http 报文中占用大量的体积,HTTP/2 又有压缩 Http Header 的特性,所以在此对 HTTP/2 也进行了测试。
实践
在 asp.net core 3.0 的文档中提到必须要配置 HTTPS 才能使用 HTTP/2。于是我开始了与 openssl 艰难的搏斗。
An HTTP/2 connection must use Application-Layer Protocol Negotiation (ALPN) and TLS 1.2 or later.
首先需要创建一个自签名的证书。
#创建私钥和x509证书
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
#把私钥和证书打包成一个PCS12证书
openssl pkcs12 -export -out cacert.p12 -in cert.pem -inkey key.pem
参考 Enforce HTTPS in ASP.NET Core,修改代码。
webBuilder.ConfigureKestrel(serverOptions => { // Set properties and call methods on options serverOptions.AddServerHeader = false; serverOptions.ConfigureEndpointDefaults(listenOptions => { listenOptions.Protocols = HttpProtocols.Http1AndHttp2; listenOptions.UseHttps("cacert.p12"); }); })
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHsts(); app.UseHttpsRedirection(); }
{
"https_port": 443,
"Logging": {
"LogLevel": {
"Default": "Information"
}
},
"AllowedHosts": "*"
}
然后证书放在项目目录下,启动后就能使用 HTTPS 和 HTTP/2 了
结论
根据测试结果,升级到 HTTPS 和 HTTP/2 对 QPS 几乎没有影响。HTTP/2 的 Header 压缩对响应好像没有什么效果,对请求好像有些作用,使用浏览器开发工具查看网络请求,请求中使用了 HTTP/2 特有的 :authority、:method、:path、:scheme。
因为开启了 HTTPS,请求头和响应头中还新增了 HTTPS 相关头部,导致体积进一步增大,不过对 QPS 没造成什么影响。响应头中的 strict-transport-security 可以去除,剩下 content-type、date、status。