envoy作为http2的前置代理 - 为envoy启用http2(又称h2)。
开箱即用的envoy没有被配置为与使用新的HTTP/2连接的客户建立连接。
HTTP/2针对现代网络进行了优化,有二进制头信息等。- 速度更高。
既然envoy能够对客户说HTTP/2,那么设置它就不难了。
而这个设置真的是 容易,也是如此。你只需添加 一 在你的监听器的common_tls_context中的一行。
alpn_protocols:[ "h2,http/1.1" ]
这就是了。(引号应该是正常的引号,以防WordPress把这些搞乱)
ALPN代表的是 应用层协议协商 - 这显然是HTTP/2工作的需要。
默认情况下,http_connection_manager envoy过滤器在AUTO模式下会同时支持HTTP1和HTTP2。
通过添加alpn_protocols,你可以实际使用这一功能。
我的envoy.yaml供你参考
我打算重现 我的整个envoy.yaml 所以你可以看到这句话必须放在什么背景下。
静态_资源。
听众。
- 地址。
socket_address:
地址。0.0.0.0
port_value: 80
filter_chains。
- 滤波器。
- 名称: envoy.http_connection_manager
配置。
codec_type: auto
stat_prefix: ingress_http
route_config。
virtual_hosts。
- 名称: 后台
域。["*"]
航线。
- 匹配。{前缀。"/" }
重新定向。
path_redirect: "/"
https_redirect: true
http_filters。
- 名称: envoy.router
配置。{}
- 地址。
socket_address:
地址。0.0.0.0
port_value:443
filter_chains。
- tls_context。
common_tls_context。
tls_certificates。
- certificate_chain: { 文件名: "/etc/example-com.crt" }
private_key: { filename: "/etc/example-com.key" }
alpn_protocols:[ "h2,http/1.1" ]
滤波器。
- 名称: envoy.http_connection_manager
配置。
stat_prefix: ingress_https
route_config。
virtual_hosts。
- 名称: 后台
域。["*"]
航线。
- 匹配。{前缀。"/" }
路线。{ 集群: target_taxgod }
http_filters。
- 名称: envoy.router
配置。{}
集群。
- 名称: target_taxgod
connect_timeout:0.25s
类型:strict_dns
lb_policy: round_robin
主持人。
- socket_address:
地址: taxgod
port_value:3000
管理员。
access_log_path:"/tmp/envoy.log"
地址。
socket_address:
地址。0.0.0.0
端口_值: 9901
该envoy.yaml采用端口80和端口443进行监听。对80端口的HTTP请求被重定向到443端口。所有流量都被发送到同一docker网络上的docker容器 "taxgod"。详情请参考我的这篇文章。
请不要指望复制粘贴这整个事情会起作用--不幸的是,WordPress有时太聪明了,它把各种字符和代码格式都搞乱了。
参考文献。
- 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 --我从这里得到了如何正确设置alpn的信息(在配置文件中把它放在哪里,以及在里面放什么)。
- https://github.com/envoyproxy/envoy/issues/3394 --这让我开始朝着正确的方向前进。在读这篇文章之前,我从未听说过ALPN。