1. ホーム
  2. java

[解決済み] Spring BootでTomcatを使用してHTTP2を有効にする

2022-02-19 15:44:49

質問

Tomcat 8.5 でのデフォルトになります。 Spring Boot 1.4 をサポートします。 HTTP/2 .

どのようにして HTTP/2 で有効になります。 スプリングブート アプリケーションを作成できますか?

どのように解決するのですか?

を有効にする最もエレガントでベストパフォーマンスな方法です。 HTTP/2 をSpring Bootアプリケーションで使用する場合は、以下のようになります。

まず、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が必要であることを忘れないでください。

次に HAProxy (バージョン >= 1.7) をTomcatの前に置いて、暗号化の面倒を見るようにしました。

クライアントはHAProxyにhttpsを話し、HAProxyはクライアントが要求したようにバックエンドに平文のHTTP/1.1またはHTTP/2を話します。 不必要なプロトコル変換はありません。

対応するHAProxy-configurationはこちらです。

# 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モードを使用する際、2つの問題に直面します。

  • 圧縮はhttpモードに依存するため、動作しない。そのため、バックエンドがそれを処理する必要があります。
  • バックエンドはクライアントのIPアドレスを見ることができない。おそらくNATが必要なのでしょう。まだ調査中です...

一般的に、HAPROXYは低レベルのTCP接続をプロキシするので、httpのものにはアクセスできません。