在asp.net core中使用HTTP/2

前言

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。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注