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 设置为开启,就可能把域名传过去。让目标服务器识别了。
如果国内有些站点要备案,另当别论。