在 Spring Boot 中使用 Tomcat 启用 HTTP2

新手上路,请多包涵

Tomcat 8.5 将成为 Spring Boot 1.4 中的默认设置,支持 HTTP/2

如何在 Spring Boot 应用程序中启用 HTTP/2

原文由 yglodt 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

使用 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 >= 8.5。

然后,您应该在 Tomcat 前面使用 HAProxy (版本 >= 1.7) 来进行加密。

客户端将通过 https 与 HAProxy 通信,而 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

使用“tcp”模式时我遇到两个问题

  • 压缩不起作用,因为它取决于模式 http。所以后端必须处理它
  • 后端看不到客户端的 IP 地址。可能我需要NAT。还在调查中…

通常,由于 haproxy 代理较低级别的 tcp 连接,因此无法访问任何 http 内容

原文由 yglodt 发布,翻译遵循 CC BY-SA 4.0 许可协议

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;
}

原文由 Mahozad 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题