amazon-web-services - 如何使用 ingress-nginx 让 HTTP/2 在 Kubernetes 集群中工作
问题描述
我们在一个 API 网关后面有许多服务,它本身就在 ingress-nginx 后面。我们正在尝试使用 HTTP/2 来加速到前端的数据传输,但我们所有的连接仍然使用 HTTP/1.1 完成。
客户端到 nginx 的连接是通过 HTTPS 进行的,但是 nginx 与我们的 API 网关使用 HTTP 进行通信,而网关也使用 HTTP 与后端服务进行通信。
我们是否需要从端到端使用 HTTPS 才能使 HTTP/2 正常工作?如果是这样,最好的设置方法是什么:使用证书?如果不是,是什么导致连接断开到 HTTP/1.1?
我们使用的是 ingress-nginx 版本 0.21.0,它有 nginx 1.15.6 和 OpenSSL 1.1.1,应该足以支持 TLS 1.3/ALPN/HTTP2。我们的 nginx-configuration configmap 已use-http2
设置为true
,我可以看到 pod/etc/nginx.conf
有一条listen ... http2;
线。
编辑 2019 年 10 月 5 日:
根据@Barry Pollard 和@Rico 的评论,我发现位于我们的 ingress-nginx 控制器前面的 AWS Elastic Load Balancer 不支持 HTTP/2。我已经从堆栈中删除了 nginx,并且我们的 API 网关正在配置它自己的网络负载均衡器。但是,我们仍然使用 HTTP/1.1。看起来 ASP.Net Core 2.2 的 HTTP 服务器 Kestrel 默认使用 HTTP/2,所以我不确定为什么连接仍然下降到 1.1。
解决方案
就像@BarryPollard 所说,您不需要端到端的 HTTP/2 在浏览器上建立 HTTP/2 连接。
听起来您用于客户端的任何内容都下降到 HTTP/1.1,请确保您尝试使用以下方法之一:
- 铬 51
- 火狐 53
- 边缘 12
- 互联网浏览器 11
- 歌剧 38
您没有指定 nginx 前面的架构是什么。它直接连接到互联网吗?或者它正在通过云负载均衡器?CDN?您还可以按照此处所述使用 Wireshark 进行测试。
推荐阅读
- c# - 每个对象都有相同的数组
- php - 正则表达式查找和替换印度字符
- mysql - 按每个房间的最近聊天对聊天室进行排序的最佳方法是什么
- java - 使用打开的 localhost 连接到 Java 服务器不起作用
- spring-boot - @Timed 注释不适用于请求范围的 bean?
- php - PHP 检查 assoc 数组的键,如果存在,将值提高 1
- wordpress-gutenberg - Wordpress Gutenberg - 嵌套子元素
- c++ - 这是什么意思:“成员引用类型'Human *'是一个指针;你的意思是使用'->'吗?”
- html - 如果有查询字符串,锚链接会在新窗口中打开,这可以防止吗?
- node.js - 直接使用节点模块和创建节点模块的对象然后使用它有什么区别?