zoukankan      html  css  js  c++  java
  • Tomcat9配置HTTP/2

    1 概述

    Tomcat从Tomcat8的一些较新版本就支持HTTP/2了,Tomcat9直接支持,本文首先讲述了相关HTTP/2的特性,接着利用一个简单的开源工具mkcert生成证书并利用该证书配置HTTP/2。

    2 HTTP/2特性

    首先介绍一下HTTP/2特性,这也从另一方面解释了为什么需要使用HTTP/2。

    2.1 二进制分帧

    HTTP/2在应用层与传输层增加了一个二进制分帧,能够达到“在不改动HTTP语义,HTTP方法,状态码,URI及首部字段的情况下,突破HTTP/1.1的性能限制,改进传输性能,实现低延迟和高吞吐量。”

    2.2 压缩头部

    HTTP/2对消息头采用了HPACK进行压缩传输,能够节省消息头占用的网络流量,而HTTP/1.x每次请求都会携带大量的冗余头信息,浪费了很多带宽资源。

    2.3 多路复用

    简单地说就是所有的请求都通过一个TCP连接并发完成。HTTP/1.x虽然能利用一个连接完成多次请求,但是多个请求之间是有先后顺序的,后面发送的请求必须等待上一个请求返回才能发送响应,很容易导致后面的请求被阻塞。而HTTP/2做到了真正的并发请求。
    HTTP/2将消息分解为帧,为每帧分配一个流标识符,然后在一个TCP连接上独立发送,HTTP/2将请求帧与响应帧交织在一起,能够让所有请求与响应都在一个套接字上发生,所有请求或响应都无法相互阻塞,减少了延迟,提高了页面加载速度,消除了对HTTP/1.1工具的需求。

    2.4 流优先及流控制

    消息帧通过对流进行发送,每个流分配了一个优先级,用于确定处理顺序以及收到的资源量,优先级可以是0-256之间的数字,可以定义依赖关系,允许在一个资源之前加载另一个资源。
    流控制管理数据的传输,允许接收者停止或减少发送的数据量,比如观看视频暂停时,客户端会通知服务器停止发送视频数据。

    2.5 服务器推送

    一般情况下需要客户端请求服务器才会响应,HTTP/2中能够先于客户端检测将要请求的资源,提前通知客户端,但是不发送资源只发送URL,客户端收到后会进行验证缓存,发现需要则正式发起请求。

    2.6 应用层协商协议

    客户端与服务器都升级才能支持HTTP/2,但是有可能存在HTTP/1与HTTP/2并存的情况,如果都使用80端口,需要选择其中一个协议通信。
    APLN(Application Layer Protocol Negotiation)就是为了解决这个问题,通过协商选择协议:

    • 首先客户端发起请求,如果支持HTTP/2则带upgrade头部
    • 若服务器不支持则拒绝升级通过HTTP/1.1返回响应
    • 若服务器支持则接受升级,切换到新分帧使用HTTP/2通信

    更多请查看RFC7540 官方文档

    3 使用mkcert生成证书

    网上大部分的教程都是使用OpenSSL生成根证书,客户端证书以及服务端证书的,一堆参数配置非常复杂,因此这里使用一个简单的一键生成本地证书的开源工具mkcert,无需任何配置。

    3.1 安装mkcert

    3.1.1 MacOS

    brew install mkcert
    brew install nss # 如果使用火狐
    

    使用MacPorts:

    sudo port selftupdate
    sudo port install mkcert
    sudo port install css # 如果使用火狐
    

    3.1.2 Linux

    需要先安装certutil

    #Debian/Ubuntu
    sudo apt install libnss3-tools
    #Red Hat/Fedora/CentOS
    sudo yum install nss-tools
    #Arch/Manjaro
    sudo pacman -S nss
    #SUSE
    sudo zypper install mozilla-nss-tools
    

    使用LinuxBrew安装:

    brew install mkcert
    

    安装LinuxBrew

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
    

    Arch/Manjaro可以使用pacman安装:

    sudo pacman -Syu mkcert
    

    或者从源码安装(需要go环境):

    git clone https://github.com/FiloSottile/mkcert && cd mkcert
    go build -ldflags "-X main.Version=$(git describe --tags)"
    

    或者使用已构建好的版本

    3.1.3 Windows

    安装Chocolatey(以管理员运行PowerShell):

    Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
    

    或安装Scoop(管理员PowerShell):

    Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
    # 或
    iwr -useb get.scoop.sh | iex
    

    使用Chocolatey或Scoop安装:

    choco install mkcert
    #或
    scoop bucket add extras
    scoop install mkcert
    

    或者使用已构建好的版本

    3.2 生成证书

    mkcert的命令非常简单,可以使用--help查看帮助:

    mkcert --help
    

    3.2.1 安装本地CA证书

    mkcert -install
    

    默认会在~/.local/share/mkcert生成CA证书。

    3.2.2 利用CA证书签发本地证书

    mkcert localhost
    

    其中localhost表示签发本地证书,可以换成example.com*.example.comexample.test127.0.0.1::1之类的域名或者ip。
    执行后会在当前文件夹下生成localhost-key.pemlocalhost.pem,前者是私钥,后者是证书。

    4 配置Tomcat

    Tomcat可以通过两种方式配置HTTP/2,一种是自带的Nio方式,另一种是使用额外库APR,APR-util与TC-Native的方式。

    4.1 使用Nio

    通过Nio配置HTTP/2需要结合OpenSSL与keytool将证书转换为pkcs#12再转换为jks

    openssl pkcs12 -export -inkey localhost-key.pem -in localhost.pem -out localhost.p12
    

    会提示输入导出密码,需要记住,转换成jks时需要用到。
    在这里插入图片描述
    接着转换为jks

    keytool -importkeystore -srckeystore localhost.p12 -srcstoretype pkcs12 -destkeystore localhost.jks
    

    这里会提示输入目标keystore与源keystore的密码,目标keystore密码一会在修改server.xml时需要用到,源keystore密码就是上面的导出密码。
    在这里插入图片描述
    接着复制localhost.jks到Tomcat的conf下并修改server.xml

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
                   maxThreads="150" SSLEnabled="true">
    	<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="conf/localhost.jks"
           				 certificateKeystorePassword="111111"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>
    

    添加了升级协议(默认HTTP/1.1):

    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
    

    另外certificateKeystorePassword是上一步的目标keystore的密码。
    完成后开启Tomcat并访问https://localhost:8443
    在这里插入图片描述
    在这里插入图片描述

    4.2 使用APR

    使用APR不需要对证书进行额外的转换,但是需要安装三个库:

    笔者的Manjaro可以直接包管理器安装:

    sudo pacman -S apr apr-util tomcat-native
    

    其他系统请自行使用包管理器或者按上面的官网链接进行编译安装。
    复制localhost-key.pemlocalhost.pem到Tomcat的conf目录下,并修改server.xml

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11AprProtocol"
                   maxThreads="150" SSLEnabled="true" >
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateKeyFile="conf/localhost-key.pem"
                         certificateFile="conf/localhost.pem"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>
    

    开启Tomcat后就可以访问https://localhost:8443了:
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    kettle imestamp : Unable to get timestamp from resultset at index 22
    ImportError: No module named setuptools 解决方案
    Tesseract-OCR
    python截图
    connect to SQL Server in python on centos
    vertica merge 优化
    kettle crontab java: command not found
    Idea 使用maven+tomcat的时候,编译指定的Profile
    Java中Vector和ArrayList的区别
    Docker入门命令
  • 原文地址:https://www.cnblogs.com/6b7b5fc3/p/13065851.html
Copyright © 2011-2022 走看看