envoy como proxy frontal http 2 - habilitar http 2 para envoy (también conocido como h2)
Out of the box envoy no está configurado para establecer conexiones con clientes que se conectan a él con el nuevo HTTP/2.
HTTP/2 está optimizado para la web moderna, con cabeceras binarias, etc. - mayor velocidad.
Dado que envoy es capaz de hablar HTTP/2 a los clientes, es una obviedad configurarlo.
Y el montaje es realmente fácilTambién. Sólo tienes que añadir un en el common_tls_context de su receptor:
alpn_protocols: [ "h2,http/1.1" ]
Eso es todo. (Las comillas deben ser normales, en caso de que WordPress las estropee)
ALPN significa Negociación del protocolo de la capa de aplicación - aparentemente es necesario para que HTTP/2 funcione.
Por defecto, el filtro envoy http_connection_manager soportará tanto HTTP1 como HTTP2 en el modo AUTO.
Al añadir los alpn_protocols se permite que esta funcionalidad se utilice realmente.
Mi envoy.yaml para su referencia
Voy a reproducir todo mi envoy.yaml para que veas el contexto en el que hay que poner la línea:
static_resources:
oyentes:
- dirección:
dirección_de_socket:
dirección: 0.0.0.0
valor_puerto: 80
cadenas_de_filtro:
- filtros:
- nombre: envoy.http_connection_manager
configurar:
codec_type: auto
stat_prefix: ingress_http
route_config:
virtual_hosts:
- nombre: backend
dominios: ["*"]
rutas:
- coincidencia: { prefijo: "/" }
redirigir:
path_redirect: "/"
https_redirect: true
http_filters:
- nombre: envoy.router
configurar: {}
- dirección:
dirección_de_socket:
dirección: 0.0.0.0
valor_de_puerto: 443
cadenas_de_filtro:
- tls_context:
common_tls_context:
tls_certificados:
- cadena_certificada: { nombre de archivo: "/etc/ejemplo-com.crt" }
private_key: { nombre de archivo: "/etc/ejemplo-com.key" }
alpn_protocols: [ "h2,http/1.1" ]
filtros:
- nombre: envoy.http_connection_manager
configurar:
stat_prefix: ingress_https
route_config:
virtual_hosts:
- nombre: backend
dominios: ["*"]
rutas:
- coincidencia: { prefijo: "/" }
ruta: { cluster: target_taxgod }
http_filters:
- nombre: envoy.router
configurar: {}
racimos:
- nombre: target_taxgod
connect_timeout: 0.25s
tipo: strict_dns
lb_policy: round_robin
anfitriones:
- dirección_de_socket:
dirección: taxgod
valor_de_puerto: 3000
admin:
access_log_path: "/tmp/envoy.log"
dirección:
dirección_de_socket:
dirección: 0.0.0.0
valor_puerto: 9901
Este envoy.yaml escucha en los puertos 80 y 443. Las peticiones HTTP al puerto 80 se redirigen al puerto 443. Todo el tráfico se envía a un contenedor docker "taxgod" en la misma red docker. Consulte este artículo mío para más detalles.
Por favor, no esperes copiar y pegar todo esto para que funcione - WordPress, por desgracia, es demasiado inteligente para su propio bien a veces, y estropea todo tipo de caracteres y el formato del código.
Referencias:
- https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation
- https://www.envoyproxy.io/docs/envoy/latest/api-v2/config/filter/network/http_connection_manager/v2/http_connection_manager.proto#enum-config-filter-network-http-connection-manager-v2-httpconnectionmanager-codectype
- https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/ssl.html?highlight=common
- https://www.envoyproxy.io/docs/envoy/latest/api-v2/api/v2/auth/cert.proto.html?highlight=common#auth-commontlscontext -> La información sobre cómo configurar alpn correctamente (dónde ponerlo en el archivo de configuración, y qué poner dentro de él) la obtuve de aquí
- https://github.com/envoyproxy/envoy/issues/3394 -> esto me hizo empezar en la dirección correcta. Nunca había oído hablar de ALPN antes de leer esto.