envoy als http 2 front proxy - inschakelen van http 2 voor envoy (aka h2)
Out of the box is envoy niet geconfigureerd om verbindingen op te zetten met clients die er verbinding mee maken met de nieuwe HTTP/2.
HTTP/2 is geoptimaliseerd voor het moderne web, met binaire headers, enz. - hogere snelheid.
Aangezien envoy in staat is om HTTP/2 uit te spreken tegen clients, is het een no-brainer om dit in te stellen.
En de opstelling is echt gemakkelijkook. Je voegt gewoon een regel in de common_tls_context van je luisteraar:
alpn_protocollen: [ "h2,http/1.1" ]
Dat is het. (De aanhalingstekens moeten normale aanhalingstekens zijn, voor het geval WordPress er een zooitje van maakt)
ALPN staat voor Onderhandeling over protocol op de applicatielaag - het is blijkbaar nodig om HTTP/2 te laten werken.
Standaard zal het http_connection_manager envoy filter zowel HTTP1 als HTTP2 ondersteunen in de modus AUTO.
Door de alpn_protocols toe te voegen maak je het mogelijk dat deze functionaliteit ook daadwerkelijk gebruikt kan worden.
Mijn envoy.yaml voor uw referentie
Ik ga reproduceren mijn hele envoy.yaml zodat je de context ziet waarin de regel moet worden geplaatst:
static_resresources:
luisteraars:
- adres:
socket_address:
adres: 0.0.0.0
port_value: 80
filter_ketens:
- filters:
- naam: envoy.http_connection_manager
config:
codec_type: auto
stat_prefix: ingress_http
route_config:
virtual_hosts:
- naam: backend
domeinen: ["*"]
routes:
- match: { prefix: "/" }
omleiden:
path_redirect: "/"
https_redirect: true
http_filters:
- naam: envoy.router
config: {}
- adres:
socket_address:
adres: 0.0.0.0
port_value: 443
filter_ketens:
- tls_context:
common_tls_context:
tls_certificaten:
- certificate_chain: { bestandsnaam: "/etc/example-com.crt" }
private_key: { bestandsnaam: "/etc/voorbeeld-com.key" }
alpn_protocollen: [ "h2,http/1.1" ]
filters:
- naam: envoy.http_connection_manager
config:
stat_prefix: ingress_https
route_config:
virtual_hosts:
- naam: backend
domeinen: ["*"]
routes:
- match: { prefix: "/" }
route: { cluster: target_taxgod }
http_filters:
- naam: envoy.router
config: {}
clusters:
- naam: target_taxgod
connect_timeout: 0.25s
type: strict_dns
lb_policy: round_robin
gastheren:
- socket_address:
adres: taxgod
port_value: 3000
admin:
access_log_path: "/tmp/envoy.log"
adres:
socket_address:
adres: 0.0.0.0
port_value: 9901
Deze envoy.yaml luistert op poort 80 en poort 443. HTTP verzoeken naar poort 80 worden omgeleid naar poort 443. Al het verkeer wordt gestuurd naar een docker container "taxgod" op hetzelfde docker netwerk. Raadpleeg dit artikel van mij voor details.
Verwacht a.u.b. niet dat het kopiëren van dit hele ding werkt - WordPress is helaas soms te slim voor zijn eigen bestwil, en knoeit met allerlei tekens en code-opmaak.
Referenties:
- 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 -> Ik heb de informatie om alpn juist in te stellen (waar het te zetten in het configuratiebestand, en wat erin te zetten) van hier
- https://github.com/envoyproxy/envoy/issues/3394 -> dit heeft me in de goede richting op weg geholpen. Ik had nog nooit van ALPN gehoord voordat ik dit las.