Kong 随记

端口

默认情况下 kong 监控一下端口

  • :8000 监听来自客户端的传入HTTP流量,并将其转发到上游服务。
  • :8443监听来自客户端的HTTPS流量。此端口具有与端口类似的行为:8000,但它仅需要HTTPS流量。可以通过配置文件禁用此端口。80008443 作为提供服务的端口,在正常的线上服务是需要修改成 80443 端口。使用 docker来启动会很方便做端口映射,而不需要对配置做修改
  • :8001 管理端口,提供管理 Admin API
  • :8444 Admin APIHTTPS 端口

在最开始的看 Kong 相关的时候,一下看到 4 个服务端口会有些焦虑,实际上只是只是两种服务提供了 HTTPHTTPS 的访问,8000和8443提供服务,8001和8443 用来管理。

配置文件

Kong 启动的时候,会根据配置文件和模板生成 nginx.conf 和 nginx_kong.conf .这两个文件的生成模板可以在 https://github.com/kong/kong/tree/master/kong/templates 中找到 ,在kong start 的时候 ,Kong 会将模板中的nginx.luanginx_kong.lua 使用模板引擎拷贝到 /usr/local/kong

在这个地方我吃了些亏,在没有仔细看文档的情况下手动修改 nginx_kong.conf 中的内容,启动后不生效。 实际是重启又被还原了。

当不能够通过配置文件来修改时,可以在 kong 中使用 --nginx-conf 来自定义模板 。

Service

kong 的设计是一个 service 对应多个 routes 。 在service 和 routes 之间做了拦截,这个拦截的过程就是插件所做的工作 。

Routes

kong 中的 route 和有些理解上有些类似 nginx 中的 location 。在匹配上又有些不同 。

paths 作为与路由匹配的路径,paths 支持正则表达式。path 中的路径是采用的是前缀匹配。 比如我们配置了 /api/api/ 的区别是 :

  • /api 可以匹配 /apiabc/apiabc
  • /api/ 只能匹配到 /api/abc

为了防止二义性,最好以 /来结尾

strip_path 从上游请求删除匹配前缀,默认为true

默认打开的情况下 ,删除匹配前缀,如果前缀为 /api/

访问/api/abc,service收到的请求:

  • 开启状态时,为 <host>/abc
  • 关闭状态时, 为 <host>/api/abc

Certificate

kong 中的证书有有几个地方,Admin API 管理的证书是我们最关心的证书。

使用 API 管理证书,使用的是 Let's Encrypt的证书,使用 acme.sh 生成,在测试环境上线后,服务的 API 请求无法到达,提示证书无法通过验证,具体表现是在 Android 上服务不可用,在 Mac 和 IOS 可用。

  1. 怀疑证书的问题,使用openresty直接配置可访问,排除
  2. 怀疑 kong 的问题,手动配置后也没有问题,排除
  3. 怀疑 API 的问题,使用其他厂商的证书无问题,排除

最后问题还是落到了怀疑某个配置上,使用证书服务检查提示缺少证书链

image-20190415183121274

作者

张巍

发布于

2019-04-24

更新于

2019-04-24

许可协议

评论