前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >再见 HTTP 1.1,怎样把网站升级成 HTTP 2?

再见 HTTP 1.1,怎样把网站升级成 HTTP 2?

作者头像
青南
发布2021-06-23 01:06:53
2.1K0
发布2021-06-23 01:06:53
举报
文章被收录于专栏:未闻Code未闻Code

阅读本文大概需要 3 分钟。

最近想给网站的协议升级 HTTP2,之前都是 HTTP 1.1。

由于网站并行加载的资源比较多,HTTP 2 相比 HTTP 1.1 来说,所有的连接共享一个 TCP 连接,同时一个域名下还没有最多同时连接数的限制,加载速度会比 1.1 好一些。

关于 HTTP2 的另外一些好处,大家可以这篇文章:https://blog.fundebug.com/2019/03/07/understand-http2-and-http3/,讲得很透彻,顺带还讲了讲 HTTP 3 也就是 QUIC 的相关知识。

正题

废话不多说了进入正题,我现在要把我的某个网站升级成 HTTP2,而且我的所有网站都是基于 Kubernetes 来 serve 的,域名解析都是通过 Nginx Ingress 来做的,那我怎么专门给某个网站升级 HTTP2 呢?

最重要的配置就在这里了:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/,我们通过修改 Ingress Controller 就可以控制 HTTP 2 的开关。

那这个 ConfigMap 又和 Ingress 什么关系呢?

答案如下:

  • Ingress 可以配置哪个域名转发到哪个后端来处理。
  • Ingress 的使用需要依赖一个 Ingress Controller。
  • 每个 Ingress Controller 会对应一个 ConfigMap 来配置当前 Nginx 服务器的行为。

在配置之前,所有的网站都是使用同一个 Ingress Controller 来处理的,而且 Ingress Controller 对应的 ConfigMap 都是一样的。

所以为了单独让某个网站应用 HTTP 2,而不影响其他网站,那就需要使用单独的 ConfigMap 来处理,那就需要一个新的 Ingress Controller。

所以,HTTP 1.1 和 HTTP 2 都分别对应一套 Ingress Controller 和 ConfigMap 的配置。

这样思路就清晰了。

所以,接下来我需要新建一个 Ingress Controller,这里我的所有网站所在的 namespace 是 scrape,所以直接用 helm 在 scrape 这个 namespace 下新建一个 Nginx Ingress 套件,这里就直接取名为 ingress-nginx3 (因为其他 namespace 已经有 ingress-nginx2 了,就顺着取名)了:

代码语言:javascript
复制
helm install ingress-nginx3 -n scrape ingress-nginx/ingress-nginx

具体可以参见:https://kubernetes.github.io/ingress-nginx/deploy/

OK,好了之后,可以观察到有一个对应的 ConfigMap 就生成了:

OK,这里 yaml 文件类似如下:

代码语言:javascript
复制
apiVersion: v1
kind: ConfigMap
metadata:
  annotations:
    meta.helm.sh/release-name: ingress-nginx3
    meta.helm.sh/release-namespace: scrape
  creationTimestamp: "2021-05-16T13:24:53Z"
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx3
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/version: 0.46.0
    helm.sh/chart: ingress-nginx-3.30.0
  managedFields:
  - apiVersion: v1
    manager: Go-http-client
    operation: Update
    time: "2021-05-16T13:24:53Z"
  - apiVersion: v1
    manager: tke-apiserver
    operation: Update
    time: "2021-05-16T13:46:33Z"
  name: ingress-nginx3-controller
  namespace: scrape
  resourceVersion: "2694665147"
  selfLink: /api/v1/namespaces/scrape/configmaps/ingress-nginx3-controller
  uid: bd60849d-be4c-4efa-9196-b00e8a4e2f8b

这里我们需要单独增加 HTTP2 的配置:

代码语言:javascript
复制
apiVersion: v1
+ data:
+  use-http2: "true"
kind: ConfigMap
metadata:
...

另外还有很多 ConfigMap 的配置,可以查阅官方文档:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/

这里我就直接配置 use-http2true 了。

“这里有个很诡异的问题,我看文档说 use-http2 默认就是 true,但不知道为什么之前一直不生效,我加了这个才生效。 ”

OK,保存 yaml 即可,这样配置工作就完成了大半了。

接下来,我们再把域名解析的地址修改成新建的 Nginx Ingress 套件中的 Ingress Controller 上就好了,Ingress Controller 背后会自动创建一个 Load Balance,对应一个公网 IP,改下域名解析地址即可。

我升级的是 spa16.scrape.center,所以只解析 spa16 的 A 地址即可。

改完之后,稍等片刻,ping 下验证下就好了。

结果

最后升级成 HTTP 2 的示例网站如下:https://spa16.scrape.center/,加载时 Network 面板如下:

可以看到加载时 Protocol 就是 h2 了,意思就是 HTTP2。

而另一个没升级的网站,网址如:https://spa15.scrape.center/,加载时 Network 面板如下:

这里的 Protocol 还是 http/1.1,意思就是 HTTP 1.1。

通过 Waterfall 大家也能看出二者的差别吧,由于 HTTP 1.1 在 Chrome 浏览器中同时只有 6-8 个连接,所以可以看到后面 2 个 chunk 文件的加载被滞后了,而 HTTP2 就不会有这个问题,Waterfall 是不是很整齐?这就是 HTTP 2 的优势之一。

OK,其实也是爬虫示例网站的其中之一,大家可以来试试爬一爬啦~

后记

有的朋友可能问,就只改 Ingress 配置就好了吗?Docker 镜像里面本身用了 HTTP 1.1 也行吗?

是的!经过我的验证,只有最后一层 Ingress 的配置改成 HTTP 2 就好了,Ingress 背后的 Docker 服务该啥样就还是啥样,也不用改镜像,也不用改 Nginx 配置,也不用专门改 HTTPS,最后一层做了 HTTP 2 的支持就好了。

舒服!

作者:崔庆才

排版:崔庆才

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正题
  • 结果
  • 后记
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档