envoy come proxy anteriore http 2 - abilitare http 2 per envoy (aka h2)
Out of the box envoy non è configurato per impostare le connessioni con i client che si connettono ad esso con il nuovo HTTP/2.
HTTP/2 è ottimizzato per il web moderno, con intestazioni binarie, ecc. - maggiore velocità.
Dal momento che envoy è in grado di parlare HTTP/2 ai client, è un gioco da ragazzi impostarlo.
E l'impostazione è davvero facile, anche. Basta aggiungere uno nella linea common_tls_context del vostro ascoltatore:
alpn_protocols: [ "h2,http/1.1" ]
Questo è tutto. (Le virgolette dovrebbero essere virgolette normali, nel caso in cui WordPress le incasini)
ALPN sta per Negoziazione del protocollo a livello di applicazione - è apparentemente necessario per far funzionare HTTP/2.
Per impostazione predefinita, il filtro http_connection_manager envoy supporta sia HTTP1 che HTTP2 nella modalità AUTO.
Aggiungendo l'alpn_protocols permettete a questa funzionalità di essere effettivamente utilizzata.
Il mio envoy.yaml per il vostro riferimento
Ho intenzione di riprodurre il mio intero envoy.yaml Così vedete il contesto in cui la linea deve essere messa:
risorse statiche:
ascoltatori:
- indirizzo:
indirizzo_presa:
indirizzo: 0.0.0.0
valore della porta: 80
catene_di_filtri:
- filtri:
- nome: envoy.http_connection_manager
config:
tipo di codec: auto
prefisso statico: ingress_http
route_config:
virtual_hosts:
- nome: backend
domini: ["*"]
percorsi:
- match: { prefix: "/" }
reindirizzare:
path_redirect: "/"
https_redirect: vero
http_filters:
- nome: envoy.router
config: {}
- indirizzo:
indirizzo_presa:
indirizzo: 0.0.0.0
valore_porta: 443
catene_di_filtri:
- tls_context:
common_tls_context:
tls_certificati:
- certificate_chain: { filename: "/etc/example-com.crt" }
private_key: { nome file: "/etc/example-com.key" }
alpn_protocols: [ "h2,http/1.1" ]
filtri:
- nome: envoy.http_connection_manager
config:
prefisso statico: ingress_https
route_config:
virtual_hosts:
- nome: backend
domini: ["*"]
percorsi:
- match: { prefix: "/" }
route: { cluster: target_taxgod }
http_filters:
- nome: envoy.router
config: {}
gruppi:
- nome: target_taxgod
connect_timeout: 0.25s
tipo: strict_dns
lb_policy: round_robin
ospiti:
- indirizzo_presa:
indirizzo: taxgod
valore_porta: 3000
admin:
percorso_log_accesso: "/tmp/envoy.log"
indirizzo:
indirizzo_presa:
indirizzo: 0.0.0.0
valore_porta: 9901
Questo envoy.yaml ascolta sulla porta 80 e sulla porta 443. Le richieste HTTP alla porta 80 sono reindirizzate alla porta 443. Tutto il traffico viene inviato a un contenitore docker "taxgod" sulla stessa rete docker. Fate riferimento a questo mio articolo per i dettagli.
Per favore non aspettatevi che il copia-incolla di tutta questa cosa funzioni - WordPress purtroppo è troppo intelligente per il suo stesso bene a volte, e incasina tutti i tipi di caratteri e la formattazione del codice.
Riferimenti:
- 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 -> Ho preso le informazioni su come impostare correttamente alpn (dove metterlo nel file di configurazione, e cosa metterci dentro) da qui
- https://github.com/envoyproxy/envoy/issues/3394 -> questo mi ha fatto iniziare nella giusta direzione. Non avevo mai sentito parlare di ALPN prima di leggere questo.