Tomcat 8.5
,这将是Spring Boot 1.4
中的默认值(将于明天发布)支持http2
。
如何在http2
应用程序中启用Spring Boot
?
答案 0 :(得分:26)
您需要将HTTP 2升级协议添加到Tomcat的连接器。您可以通过自定义嵌入式Tomcat容器来实现:
@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
return (container) -> {
if (container instanceof TomcatEmbeddedServletContainerFactory) {
((TomcatEmbeddedServletContainerFactory) container)
.addConnectorCustomizers((connector) -> {
connector.addUpgradeProtocol(new Http2Protocol());
});
}
};
}
@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
if (container instanceof TomcatEmbeddedServletContainerFactory) {
((TomcatEmbeddedServletContainerFactory) container)
.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
connector.addUpgradeProtocol(new Http2Protocol());
}
});
}
}
};
}
答案 1 :(得分:16)
使用Spring Boot应用程序启用HTTP/2
的最优雅且性能最佳的方法如下所示。
首先,正如Andy Wilkinson所说,你需要在Tomcat级别启用HTTP / 2:
@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
return (container) -> {
if (container instanceof TomcatEmbeddedServletContainerFactory) {
((TomcatEmbeddedServletContainerFactory) container)
.addConnectorCustomizers((connector) -> {
connector.addUpgradeProtocol(new Http2Protocol());
});
}
};
}
如果您没有使用嵌入式Tomcat,可以像这样设置HTTP / 2监听:
<Connector port="5080" protocol="HTTP/1.1" connectionTimeout="20000">
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>
请记住,您需要Tomcat&gt; = 8.5。
然后,您应该在Tomcat前面使用HAProxy
(版本&gt; = 1.7)来处理加密。
客户端将向HAProxy发送https,HAProxy将根据客户端请求向后端发送明文HTTP / 1.1或HTTP / 2。 不会有不必要的协议翻译。
匹配的HAProxy配置在这里:
# Create PEM: cat cert.crt cert.key ca.crt > /etc/ssl/certs/cert.pem
global
tune.ssl.default-dh-param 2048
ssl-default-bind-options no-sslv3 no-tls-tickets force-tlsv12
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
chroot /var/lib/haproxy
user haproxy
group haproxy
defaults
timeout connect 10000ms
timeout client 60000ms
timeout server 60000ms
frontend fe_https
mode tcp
rspadd Strict-Transport-Security:\ max-age=31536000;\ includeSubDomains;\ preload
rspadd X-Frame-Options:\ DENY
bind *:443 ssl crt /etc/ssl/certs/cert.pem alpn h2,http/1.1
default_backend be_http
backend be_http
mode tcp
server domain 127.0.0.1:8080
# compression algo gzip # does not work in mode "tcp"
# compression type text/html text/css text/javascript application/json
编辑2019
使用模式&#34; tcp&#34;
时遇到两个问题通常,由于haproxy代理较低级别的tcp连接,因此无法访问任何http内容
答案 2 :(得分:13)
在Spring Boot 2.1及更高版本中,它就像将此属性添加到.properties(或.yml)文件一样简单:
server.http2.enabled=true
你也可以这样编程(在你的一个配置类中):
@Bean
public ConfigurableServletWebServerFactory tomcatCustomizer() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(connector -> connector.addUpgradeProtocol(new Http2Protocol()));
return factory;
}
答案 3 :(得分:8)
在Spring Boot 2中,您首先需要一个证书-它可以这样生成:
keytool -genkey -keyalg RSA -alias my-the-best-api -keystore c:\tmp\keystore.store -storepass secret -validity 3650 -keysize 2048
比您只需要将此证书添加到classpath并将所需的属性添加到application.properties:
server.http2.enabled=true
server.port = 8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-password=secret
答案 4 :(得分:1)
默认情况下,Spring Boot 2.2.0+随Tomcat 9.0.x一起提供,当使用JDK 9或更高版本时,Tomcat 9.0.x支持HTTP / 2。 Link