Kong 随记
端口
默认情况下 kong 监控一下端口
:8000
监听来自客户端的传入HTTP流量,并将其转发到上游服务。:8443
监听来自客户端的HTTPS流量。此端口具有与端口类似的行为:8000
,但它仅需要HTTPS流量。可以通过配置文件禁用此端口。8000
和8443
作为提供服务的端口,在正常的线上服务是需要修改成80
和443
端口。使用docker
来启动会很方便做端口映射,而不需要对配置做修改:8001
管理端口,提供管理 Admin API:8444
Admin API 的HTTPS
端口
在最开始的看 Kong 相关的时候,一下看到 4 个服务端口会有些焦虑,实际上只是只是两种服务提供了 HTTP
和 HTTPS
的访问,8000和8443提供服务,8001和8443 用来管理。
配置文件
Kong 启动的时候,会根据配置文件和模板生成 nginx.conf 和 nginx_kong.conf .这两个文件的生成模板可以在 https://github.com/kong/kong/tree/master/kong/templates
中找到 ,在kong start 的时候 ,Kong 会将模板中的nginx.lua
和nginx_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 可用。
- 怀疑证书的问题,使用openresty直接配置可访问,排除
- 怀疑 kong 的问题,手动配置后也没有问题,排除
- 怀疑 API 的问题,使用其他厂商的证书无问题,排除
最后问题还是落到了怀疑某个配置上,使用证书服务检查提示缺少证书链