docker pull postgres:9.6
docker run -d --name postgres \
-p 5432:5432 \
-e "POSTGRES_USER=kong_user" \
-e "POSTGRES_DB=kong_db" \
-e "POSTGRES_PASSWORD=123456" \
postgres:9.6
–name,指定创建的容器的名字;
-e POSTGRES_PASSWORD=password,设置环境变量,指定数据库的登录口令为password;
-p 5432:5432,端口映射将容器的5432端口映射到外部机器的5432端口;
-d postgres:9.6,指定使用postgres:9.6作为镜像。
kong安装官方网址
sudo apt-get install netcat openssl libpcre3 dnsmasq procps
可以在官方网址下载最新的kong的deb安装包我使用的是当前最新版本,然后执行命令
sudo dpkg -i kong-2.0.4.xenial.amd64.deb
因为kong的配置相对简单,我这里只是简单的配置了数据库.
sudo vim /etc/kong/kong.conf
按照上述postgresql安装,已经准备好存储,现在需要执行kong migrations来初始化数据库表
kong migrations bootstrap ##高版本使用
这里我没有指定配置文件,使用的都是kong默认的配置,也可以指定自定义配置文件
#kong.conf的路径,默认是/etc/kong/kong.conf
kong migrations bootstrap [-c /path/to/kong.conf] ## kong配置文件地址
sudo kong stop
sudo kong start
curl -i -X GET --url http://192.168.0.198:8001
sudo apt-get update
docker network create kong-net
拉取konga最新的镜像
docker pull pantsel/konga:latest
docker run --rm pantsel/konga:latest -c prepare -a postgres -u postgresql://kong_user:123456@ip:5432/kong_db
命令行中的kong_user是postgres创建的用户和密码123456可以替换为你自己的
ip是postgres数据库的ip地址5432端口kong_db是上面创建的数据库
以上解释都可以自行定义
docker run -p 1337:1337 \
--network kong-net \
--name konga \
-e "NODE_ENV=production" \
-e "DB_ADAPTER=postgres" \
-e "DB_URI=postgresql://kong_user:123456@ip:5432/kong_db" \
pantsel/konga
使用命令创建服务和测试服务代理
curl -X POST http://ip:8001/upstreams --data "name=blog"
创建一个上游服务名字为blog相当于nginx.conf中的
upstream blog{
}
curl -X POST http://ip:8001/upstreams/blog/targets --data "target=ip:8001" --data "weight=100"
创建一个目标代理权重为100相当于nginx.conf中的一个上游服务中可以创建多个代理
执行完上面的命令
upstream blog{
server ip:8001 weight=100;
server ip:8003 weight=50;
}
curl -X POST http://192.168.0.198:8001/services --data "name=helloblog" --data "host=blog"
创建一个服务执行完之后会生成一个服务id
server {
listen 80;
proxy_pass http://blog;
}
curl -X POST http://ip:8001/routes --data "paths[]=/helloblog" --data "service.id=65689b01-09e4-45e0-891b-da6fa3dfc192"
路由绑定服务
server {
listen 80;
location /helloblog{
proxy_pass http://blog;
}
}
upstream blog{
server 192.168.0.198:8001 weight=100;
}
server {
listen 80;
location /helloblog{
proxy_pass http://blog;
}
}
1个upstream可以负载均衡多个target
1个service可以匹配多个route
可配置项:
year:年
month: 月
day: 天
minute:分钟,这里我们配置3,表示每分钟不能超过3次调用。
Second: 秒
计算频率的维度:月/天/分钟/秒, 假如同时配置多个维度,会同时生效。
根据年、月、日、时、分、秒设置限流规则,多个限制同时生效。
比如:每天不能超过10次调用,每分不能超过3次。
当一分钟内,访问超过3次,第四次就会报错。
当一天内,访问次数超过10次,第十一次就会报错。
** 规则:
IP黑白名单,支持单个,多个,范围分段IP(满足CIDR notation规则)。多个IP之间用逗号,分隔。
CIDR notation规范如下:
10.10.10.0/24 表示10.10.10.*的都不能访问。
1.设置黑名单IP
在这里,我将我自己的IP设置成黑名单 **
对service或route创建 bot-detection可以根据User-agent对请求分类到黑名单或白名单
下面是三个浏览器的User-Agent
IE浏览器: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362
火狐: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0
Chrome: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
配置
注意:开发人员可以自定义黑白名单的配置同样也支持User-Agent配置只要请求的时候带上头文件就可以进行拦截请求
.*Edge.* # 配置iE浏览器不能访问 黑名单配置
.*Firefox.* # 配置火狐浏览器不能访问
.*Safari.* # 配置谷歌浏览器不能访问
下面配置IE浏览器不能访问服务
自定义配置示例
使用postman中将请求的User-Agent设为kong-botdetection发送请求可以看到返回Fobidden消息
对请求的payload size进行设定。设定是以M为单位的
使用konga配置lua脚本
这里我选择的是请求之前处理逻辑如果请求头没有x-custom-auth相应401
-- Get list of request headers
local custom_auth = kong.request.get_header("x-custom-auth")
-- Terminate request early if our custom authentication header
-- does not exist
if not custom_auth then
return kong.response.exit(401, "Invalid Credentials")
end
-- Remove custom authentication header from request
kong.service.request.clear_header('x-custom-auth')