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 官方文档​httpwg.org

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不需要对证书进行额外的转换,但是需要安装三个库(APR+APR-util+TC-Native):

The Apache Portable Runtime Project​apr.apache.orgThe Apache Portable Runtime Project​apr.apache.orgApache Tomcat Native Library​tomcat.apache.org

笔者的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了:

apache http server 停止工作_Tomcat9配置HTTP/2相关推荐

  1. apache http server 停止工作_配置nginx,Apache支持pathinfo模式-什么是phpinfo模式

    我也配置了很多次了,前面都快放弃了,最近在学习resuful框架写api,代码实现上没出现啥问题,倒是这个path_info的环境配置把我弄的比较郁闷 你一定见过类似这样的路径:http://www. ...

  2. apache http server 停止工作_Springboot以Tomcat为容器实现http重定向到https的两种方式

    1 简介 本文将介绍在Springboot中如何通过代码实现Http到Https的重定向,本文仅讲解Tomcat作为容器的情况,其它容器将在以后一一道来. 建议阅读之前的相关文章: (1) Sprin ...

  3. apache http server 停止工作_宝塔apache启动失败:报错 AH00526: Syntax error on line 解决方案...

    错误信息: AH00526: Syntax error on line 54 of /www/server/apache/conf/httpd.conf: Cannot define multiple ...

  4. apache http server 停止工作_(二)http协议的网站装ssl升级成https

    最终目标:微信小程序要想上线 必须内部所有域名都是https,比如网络图片,比如后端接口,比如其他链接. 问:既然https://minihome.top/能直接访问了,那我用eggjs(node)写 ...

  5. php apache停止工作,phpStudy Apache 经常出现停止工作

    [HTML] 纯文本查看 复制代码[Fri Nov 08 10:44:16.550058 2019] [mpm_winnt:notice] [pid 356:tid 480] AH00455: Apa ...

  6. Apache Traffic Server安装配置

    介绍 Apache Traffic Server(ATS或TS)是一个高性能的.模块化的 HTTP 代理和缓存服务器.Traffic Server 最初是 Inktomi 公司的商业产品,该公司在 2 ...

  7. linux 下 apache启动、停止、重启命令

    基本的操作方法: 本文假设你的apahce安装目录为/usr/local/apache2,这些方法适合任何情况 apahce启动命令: 推荐/usr/local/apache2/bin/apachec ...

  8. mysql服务器停止工作原理_MySQL服务器突然停止工作! - CentOS

    今天,当我尝试执行一些 DELETE sql脚本时,MySQL Server停止工作 . 我重启服务器很多次了,但它有帮助.2826348_ t . service mysqld start 报告: ...

  9. centos 下apache启动、停止、重启命令

    基本的操作方法 本文假设你的apahce安装目录为/usr/local/apache2,这些方法适合任何情况 #/usr/local/apache2/bin/apachectl start apace ...

最新文章

  1. etcd 笔记(01)— etcd 简介、特点、应用场景、常用术语、分布式 CAP 理论、分布式原理
  2. python官网下载步骤linux-Linux 安装python3.x步骤
  3. 006_FastDFS文件上传
  4. Html做网络硬盘系统交互,教你做网络硬盘(上)
  5. css:hover伪类的使用
  6. python 问题集
  7. Android各版本最新份额:果冻豆达62% 仍居首位
  8. 搜索很久_装了SSD你还需要这个软件才更快,搜索查找文件数据从此不再等待
  9. 在图论中,网络流(Network Flow)
  10. CNN卷积神经网络之卷积运算的初步理解
  11. paip.提升开发效率---事件化V0829
  12. 数电第二版 潘松 陈龙 第二章 答案
  13. Win10投影到此电脑用不了,投影此电脑是灰色
  14. 安装elasticsearch遇到的几个问题
  15. Python集合运算
  16. APS高级排程在钣金冲压行业的应用
  17. dpdk pktgen发包工具使用
  18. 第9周测验-鸣人和佐助
  19. 淘宝商品评价api接口,淘宝评论视频API接口,淘宝评论API接口(app、h5端)
  20. nginx配置防止域名恶意解析

热门文章

  1. 【面试必背】 常问的15个MySQL数据库查询语句,
  2. 游戏测试与一般的软件测试的区别在哪里?
  3. Push消息如何测试?
  4. 监管码服务器维修,云风的 BLOG
  5. CSS基础-行高(height和line-height)【学习笔记】
  6. (java)玩转算法系列-数据结构精讲[学习笔记](一)不要小瞧数组
  7. Fiddler抓包一键生成代码
  8. 软件测试入坑建议:新手零基础怎么入门软件测试?你还缺这几份资料!
  9. php版本kms,通过 AWS KMS API 和 AWS SDK for PHP 版本 3 使用密钥 - 适用于 PHP 的 AWS 开发工具包...
  10. python编程资料包_强力推荐,非常全的Python编程400集学习资料(今日限免)