Ответ 1
Ниже приведен самый элегантный и эффективный способ включения HTTP/2
с приложением Spring Boot.
Во-первых, как упоминалось в ответе Энди Уилкинсона, вам нужно включить HTTP/2 на уровне Tomcat:
@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, чтобы позаботиться о шифровании.
Клиент будет передавать 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. Все еще расследую...
Как правило, поскольку прокси-серверы прокси-сервера низшего уровня TCP, нет доступа к http