kong konga从开始就踩坑

因为之前有用过nginx,httpd,还有各种的自己写tcp端口来处理服务的。所以当使用kong konga的时候就各种与之前的知识打架。

坑1:

我就是要在原机上装kong,konga

操作:首先官网文档走起,一步一步地按照文档操作。

结果:glibc要求2.28.

原来我在centos7上,以为在centos8上操作。本来有两台机,一个7,一个8.结果7在操作一大半,发现操作错了。

改回到8.很顺利地装好了kong. 

坑2:

kong manger是什么东西,各种配端口。结果发现,毛用都没用。这个是kong manger管理界面。直接换成konga

坑3:

我要装mysql,看下官方文档,原来只支持postpres.毛线,花N多时间找资料,至于为什么想用mysql,因为想数据统一管理呗。

还有konga只支持postpres吧。

坑4:

我就是要在原机装konga.。。。。嗯嗯.各种源安装,数据库创建,git so easy.毛线,前端各种依赖跟不上。而且玩过前端的都知道装个npm -g 毛线的那个node_moudle占多十几G,以为我的机子是开发机吗?

直接玩docker

为毛之前不想玩docker,因为我没钱,买的配置很低,不想跑doceker呀。

坑5:

老实人跟着人家说的kong窗口走。下面我贴一下人家的容器命令

安装kong,按照官网的教程:
docker pull kong/kong-gateway:2.4.1.0-alpine
docker images
docker tag <IMAGE_ID> kong-ee
docker network create kong-ee-net

  上面那个tag 要改成 镜像ID之外,没问题,还有这里这个网络很有用。它可以让几个容器之间可以访问

建数据库:
docker run -d --name kong-ee-database 
--network=kong-ee-net 
-p 5432:5432 
-e "POSTGRES_USER=kong" 
-e "POSTGRES_DB=kong" 
-e "POSTGRES_PASSWORD=kong" 
postgres:9.6

  走起,没问题,这里有指明一个sql的镜像,如果没下载,它会自动给你下载来的。

导docker库数据:
docker run --rm --network=kong-ee-net 
-e "KONG_DATABASE=postgres" 
-e "KONG_PG_HOST=kong-ee-database" 
-e "KONG_PG_PASSWORD=kong" 
-e "KONG_PASSWORD=kong" 
kong-ee kong migrations bootstrap

  这个命令也没问题,就是弄一下数据库初始化

启动kong:
docker run -d --name kong 
--network=kong-ee-net 
-e "KONG_DATABASE=postgres" 
-e "KONG_PG_HOST=kong-ee-database" 
-e "POSTGRES_DB=kong" 
-e "KONG_PG_USER=kong" 
-e "KONG_PG_PASSWORD=kong" 
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001,0.0.0.0:8444 ssl" 
-p 8000:8000 
-p 8001:8001 
-p 8443:8443 
-p 8444:8444 
kong:latest

  这里要说一下,这个kong:latest,因为上面已经把它改为kong-ee,所以要改,不过这里最大的坑是8000:8000,8443:8443

这里说明一下,因为这个kong本来就是要用来做代理的。所以它就是一个对外提供端口服务网关。8000,8443要改为80,443,这样才能对接外面的无端口域名,https无端口域名的访问。

坑6:

kong代理线路,upstreams里的名称,要跟service里的host一致。service里的protocol是指的目标服务器的协议,因为目标服务器可以是http和https,service里的端口就像是nginx里的listen,什么?你说为什么使用80端口,也能用https?配就是了。这个我也不懂,不过我就是用80

routes就像是nginx里的location,不过rotes里要配service alias就是域名映射,有点像nginx的域名解析。path就是要代理的路径。

https的配置,先在左边的证书栏目里添加证书。添加一个snis,这个snis要跟routes里的snis一致。好了。https配置成功。这里的https在上面一定要把容器的8443改为443.  致于路径的配置。service里的路径就像upstreams端口后面的路径。routes的路径就像是location代理的路径。所以如果走不通。先在nginx走一次看看能不能通。再把对应的参数在konga里修改

 更多坑:如果让http强制转到https

看到有的文章说,要把容器里的东西映射到宿主机。不过这个做法有点复杂

可能使用lua脚本来处理,使用插件。

在要使用到的route里添加上对应的插件:plugins->serverless->pre function  这个意思是,在执行操作前,运行这个函数

在添加的函数下添加以下代码:

local a=kong.request.get_scheme()if a=="http"then local b=kong.request.get_host()local c=kong.request.get_path_with_query()local d="https://"..b..c;kong.response.set_header("Location",d)return kong.response.exit(302,d)end

  记得按enter,它才认为有数据填入。然后,http的就会自动转到https了

坑7:大坑

居然8001端口随便访问?还有没有王法。自从装了这个东西,让我天天睡不着觉。怎么可能重要的服务让人家乱搞嘛。

下面是解决方案。

首先,让8001的服务变为kong自己的一个服务。然后把这个服务加上验证。

走起:

先建一个upsteam,然后目标弄为内网IP加端口。如localhost:8001,这个时候,上面的容器就可以再处理一下,再弄一个不要绑定8001端口的。

建一个service对应upsteam

建一个route对应service,这里,给这个route加一个单独的域名吧。没有域名的关我毛事。给route添加basic auth.也就是说这个8001要用户名和密码才能使用。

最后在konga的connects那里,改为这个新的验证

最后一步。到服务器,去掉对外的8001端口

我们把上面的kong的容器停止,删掉。然后用下面的语句创建一个新的

docker run -d --name kong 
--network=kong-ee-net 
-e "KONG_DATABASE=postgres" 
-e "KONG_PG_HOST=kong-ee-database" 
-e "POSTGRES_DB=kong" 
-e "KONG_PG_USER=kong" 
-e "KONG_PG_PASSWORD=kong" 
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001,0.0.0.0:8444 ssl" 
-p 80:8000 
-p 443:8443 
kong-ee:latest

  这时,尽量减少了对外的端口

那个konga的就留着吧,因为那个有验证。88

坑X:

场景-》如果是代理的目标是一个nginx服务器,而nginx服务器是使用域名来识别站点的。就是都用80端口来。根据域名不同指向不同的站点。

查了很多,都 是说把docker里的配置文件映射到宿主机出来。然后直接改配置文件 ,像改nginx一样。

就是改那个poxy_set_header

其实konga里有一个,是否开启host向前传递的功能。 

Preserve Host   设置为开启,就可能把域名传过去。让目标服务器识别了。

如果国内有些站点要备案,另当别论。

原文地址:https://www.cnblogs.com/bfyang5130/p/15202903.html