Kong插件开发新建Kong配置文件配置文件/etc/kong/kong.conf，可以先随便建一个，后面拷贝Kong容器里面的kong.conf.default出来新建插件目录/kongdev/kong/plugins，在目录内以插件名称再创建插件目录文件新建必须的插件模块文件handler.lua-- 根据插件beta_switch配置打印日志或返回相应头部内容 local BasePlugin = require "kong.plugins.base_plugin" local BetaHandler = BasePlugin:extend() BetaHandler.PRIORITY = 2000 function BetaHandler:new() BetaHandler.super.new(self, "betahandler") end function BetaHandler:access(conf) BetaHandler.super.access(self) if conf.beta_switch then -- 日志里面打印内容 ngx.log(ngx.ERR, "Beta Opening") -- 头部里面增加信息 ngx.header["Beta"] = "Opening" else -- 日志里面打印内容 ngx.log(ngx.ERR, "Beta Closed") -- 头部里面增加信息 ngx.header["Beta"] = "Closed" end end return BetaHandlerschema.lua-- 配置信息设置 return { no_consumer = true, fields = { beta_switch = { type = "boolean", default = true } } }部署Kong、KongA和Postgresql由于配置和插件文件需要映射到主机的目录，所以Kong的启动参数需要添加卷映射，KongA和Postgresql的部署可以参考Kong部署的文章Kong Docker启动脚本docker run -d --name kong \ --network=kong-net \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=kong-database" \ -e "KONG_PG_USER=kong" \ -e "KONG_PG_PASSWORD=kong" \ -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \ -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \ -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \ -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \ -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \ -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \ -p 8000:8000 \ -p 8443:8443 \ -p 0.0.0.0:8001:8001 \ -p 0.0.0.0:8444:8444 \ -v /kongdev/kong/plugins:/kongdev/kong/plugins\ -v /etc/kong/kong.conf:/etc/kong/kong.conf\ kong:latest注意由于映射目录需要将SELinux关闭setenforce 0编辑kong.conf的配置，找到以下2项改为相应的配置plugins = bundled,beta lua_package_path = /kongdev/?.lua;./?.lua;./?/init.lua;;验证插件KongA界面添加服务、路由和插件添加服务添加路由添加插件命令添加服务、路由和插件创建一个servicecurl -i -X POST --url http://127.0.0.1:8001/services/ --data 'name=beta-service' --data 'url=https://blog.miacraft.cn/'为服务指定路由curl -i -X POST --url http://127.0.0.1:8001/services/beta-service/routes --data 'paths[]=/beta'添加插件curl -i -X POST --url http://127.0.0.1:8001/services/beta-service/plugins/ --data 'name=beta'验证结果访问路由curl -i -X GET --url http://127.0.0.1:8000/beta或者通过浏览器访问目标主机地址8000端口+beta路径访问之后1.查看日志是有相关字段输出docker logs kong2.请求返回的头部也插入了相关字段其它信息获取IP的几种方式1.kong.client.get_ip()Kong获取到的IP，一般都为上一跳的2.kong.client.get_forwarded_ip()转发的IP，实际测试中不是X_FORWARDED_FOR3.ngx.var.remote_addr实际测试中似乎受启动配置文件real_ip_header参数设置影响如Docker启动参数改为KONG_TRUSTED_IPS=0.0.0.0/0,::/0和KONG_REAL_IP_HEADER=X-REAL-IP则获取的IP为X-REAL-IP4.ngx.var.binary_remote_addr获取到的二进制数据5.ngx.req.get_headers(),headers["X-REAL-IP"]即最真实的X-REAL-IP参数6.ngx.req.get_headers(),headers["X_FORWARDED_FOR"]即最真实的X_FORWARDED_FOR参数KongA插件图标地址如果要替换图标则将相应的插件图标放入此路径即可，图片为png格式，名称需与插件名称对齐/app/assets/images/kong/plugins/Kong自带插件路径/usr/local/share/lua/5.1/kong/plugins/参考链接http://www.itblg.com/other/lua/5d536050ffc18f80062f2743https://zhuanlan.zhihu.com/p/52402537https://blog.csdn.net/m0_38086372/article/details/106873018工具包以及函数使用介绍https://www.jianshu.com/p/bf7f7bfb0639
Kong是一个API网关，基于OpenResty可以在其基础上扩展API管理以及相关安全插件，其社区还有好多免费或收费的安全插件Kong安装部署Docker部署创建网络docker network create kong-net准备数据库cassandra和postgres二选一安装cassandradocker run -d --name kong-database \ --network=kong-net \ -p 9042:9042 \ cassandra:3安装postgresdocker run -d --name kong-database \ --network=kong-net \ -p 5432:5432 \ -e "POSTGRES_USER=kong" \ -e "POSTGRES_DB=kong" \ -e "POSTGRES_PASSWORD=kong" \ postgres:9.6安装Kong迁移数据docker run --rm \ --network=kong-net \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=kong-database" \ -e "KONG_PG_USER=kong" \ -e "KONG_PG_PASSWORD=kong" \ -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \ kong:latest kong migrations bootstrap开启Kongdocker run -d --name kong \ --network=kong-net \ -e "KONG_DATABASE=postgres" \ -e "KONG_PG_HOST=kong-database" \ -e "KONG_PG_USER=kong" \ -e "KONG_PG_PASSWORD=kong" \ -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \ -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \ -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \ -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \ -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \ -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \ -p 8000:8000 \ -p 8443:8443 \ -p 0.0.0.0:8001:8001 \ -p 0.0.0.0:8444:8444 \ kong:latest常规RPM包部署安装PostGreSQL下载PostGreSQL RPM安装包并安装wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm yum -y install pgdg-redhat-repo-latest.noarch.rpm yum install -y postgresql96 yum install -y postgresql96-server初始化开启服务并登录/usr/pgsql-9.6/bin/postgresql96-setup initdb systemctl enable postgresql-9.6 systemctl start postgresql-9.6 su - postgres创建Kong相关的数据库和账号psql CREATE USER kong WITH PASSWORD 'kong'; CREATE DATABASE kong OWNER kong; GRANT ALL PRIVILEGES ON DATABASE kong to kong;编辑配置文件，将其监听端口范围放开sed -i "s|#listen_addresses = 'localhost'|listen_addresses = '*'|g" /var/lib/pgsql/9.6/data/postgresql.conf修改pg_hba.conf文件，将其# IPv4 local connections:修改成如图所示，主要将ident和peer改为trustvi /var/lib/pgsql/9.6/data/pg_hba.conf设置环境变量vi /etc/profileexport PATH=$PATH:/usr/pgsql-9.6/binsource /etc/profile重启服务systemctl restart postgresql-9.6安装Kong下载安装Kong RPM包注意：实际安装最好安装版本较高的Kong，可能导致KongA对接不上的情况，实测2.3.3可以对接0.14.9的KongAwget https://kong.bintray.com/kong-community-edition-rpm/centos/7/kong-community-edition-1.1.2.el7.noarch.rpm yum -y install kong-community-edition-1.1.2.el7.noarch.rpm 编辑配置文件，主要修改数据库配置相关cp /etc/kong/kong.conf.default /etc/kong/kong.conf vi /etc/kong/kong.conf迁移数据库kong migrations bootstrap -c /etc/kong/kong.conf启动Kong并关闭防火墙，也可以放开相应端口kong start -c /etc/kong/kong.conf --vv systemctl stop firewalld检查状态，两个命令都可以检查curl -i http://localhost:8001/ kong health安装KongA由于KongA依赖NPM、Node.js等，环境比较复杂，推荐用下面的Docker安装，后续安装成功的时候再补充注意1.安装启动的时候去除docker的网络且需要在postgresql的配置开放允许Docker实例的IP访问2.还需要改Kong的配置文件/etc/kong/kong.conf使其admin端口监听0.0.0.0:8001即修改成admin_listen = 0.0.0.0:8001, 0.0.0.0:8444 ssl3.创建连接的时候需要通过实际IP连接，因为localhost和127.0.0.1都是其本机IP部署可视化管理工具注意：KongA和Kong-Dashboard二选一，kong-dashboard不支持Kong 2.0，管理界面最好部署KongA安装Kong Dashboarddocker run --rm -p 8005:8080 pgbi/kong-dashboard start --kong-url http://localhost:8001说明参考https://www.jianshu.com/p/259b38cbaaf6安装Konga注意：IP地址需要根据实际情况替换docker run -p 1337:1337 \ --network=kong-net \ -e "DB_ADAPTER=postgres" \ -e "DB_HOST=192.168.102.200" \ -e "DB_PORT=5432" \ -e "DB_USER=kong" \ -e "DB_PASSWORD=kong" \ -e "DB_DATABASE=kong" \ -e "NODE_ENV=development" \ --name konga \ pantsel/konga部署好之后首先应该创建连接，连接即对应到被管理的Kong登录及设置部署信息首次登录之后需要自定义账号和密码示例账号：kong示例密码：Kong.01KongA登录地址：http://192.168.102.200:1337/#!/settings其它说明服务：Service是kong对上游的微服务和API进行管理的组件。服务的路径属性会传递到上有服务，即会加上路径去请求上有的API接口路由：Router所属于Service，是指请求链接到kong后发送到Service，然后Service通过Router代理流量到上游的服务接口，一个Service可以有多个Router。路由的路径属性是匹配请求过来的路径，即如果请求到Kong的带有/target路径则会匹配，没匹配上的会报"no route..."错误添加服务curl -i -X POST --url http://localhost:8001/services/ --data 'name=text-classification' --data 'url=http://ip:port/cls/cls1'添加路由curl -i -X POST --url http://localhost:8001/services/text-classification/routes --data 'hosts[]=text-classification.com'Kong教程，介绍各个插件https://www.jianshu.com/p/a68e45bcadb6插件请求次数频率限制插件仅仅限制速率，不会拉黑https://www.jianshu.com/p/8ad7bd643b53爬虫控制插件https://www.jianshu.com/p/270ce994822d配置详解https://www.jianshu.com/p/f3b1699777d6Kong插件库https://docs.konghq.com/hub/排障参考如果开启KongA的过程中出现类似如下的错误iptables failed: iptables --wait -t nat -A DOCKER -p tcp...解决方案pkill docker iptables -t nat -F ifconfig docker0 down systemctl restart docker参考链接https://docs.konghq.com/install/docker/https://blog.csdn.net/xavi_2010/article/details/107150855https://www.lyafei.com/archives/244/KongAhttps://www.cnblogs.com/Zzang/p/11574072.htmlhttps://www.cnblogs.com/66li/p/11653408.htmlhttps://hub.docker.com/r/pantsel/konga#installationhttps://github.com/pantsel/kongaRPM安装PostGreSQLhttps://www.cnblogs.com/netonline/p/7657810.htmlRPM安装Konghttps://www.cnblogs.com/langfanyun/p/10298491.html