前言
本文详细介绍了 Apisix Dashboard 的使用方法,从如何安装和配置 Dashboard,到如何使用 Dashboard 进行 API 管理、流量控制、日志统计等方面进行了详解。同时,还提供了丰富的示例代码和截图展示,帮助读者更好地理解和掌握 Dashboard 的功能。在本文中,您将了解到如何使用 Apisix Dashboard 管理和监控 API 网关,优化和控制网络流量,以及如何在 Dashboard 中有效地管理和监控应用程序的健康状况,从而提高系统性能和可靠性。通过本文的指导,您可以轻松地掌握 Apisix Dashboard 的使用技巧,并学以致用。
安装Apisix Dashboard
配置文件示例
主要修改etcd.endpoints配置,需要与Apisix安装时同一个etcd集群
conf:
listen:
# host: 127.0.0.1 # the address on which the `Manager API` should listen.
# The default value is 0.0.0.0, if want to specify, please enable it.
# This value accepts IPv4, IPv6, and hostname.
port: 9000 # The port on which the `Manager API` should listen.
# ssl:
# host: 127.0.0.1 # the address on which the `Manager API` should listen for HTTPS.
# The default value is 0.0.0.0, if want to specify, please enable it.
# port: 9001 # The port on which the `Manager API` should listen for HTTPS.
# cert: "/tmp/cert/example.crt" # Path of your SSL cert.
# key: "/tmp/cert/example.key" # Path of your SSL key.
allow_list: # If we don't set any IP list, then any IP access is allowed by default.
- 127.0.0.1 # The rules are checked in sequence until the first match is found.
- ::1 # In this example, access is allowed only for IPv4 network 127.0.0.1, and for IPv6 network ::1.
- 0.0.0.0/0 # It also support CIDR like 192.168.1.0/24 and 2001:0db8::/32
etcd:
endpoints: # supports defining multiple etcd host addresses for an etcd cluster
- 10.246.0.162:2379
# yamllint disable rule:comments-indentation
# etcd basic auth info
# username: "root" # ignore etcd username if not enable etcd auth
# password: "123456" # ignore etcd password if not enable etcd auth
mtls:
key_file: "" # Path of your self-signed client side key
cert_file: "" # Path of your self-signed client side cert
ca_file: "" # Path of your self-signed ca cert, the CA is used to sign callers' certificates
# prefix: /apisix # apisix config's prefix in etcd, /apisix by default
log:
error_log:
level: warn # supports levels, lower to higher: debug, info, warn, error, panic, fatal
file_path:
logs/error.log # supports relative path, absolute path, standard output
# such as: logs/error.log, /tmp/logs/error.log, /dev/stdout, /dev/stderr
# such as absolute path on Windows: winfile:///C:\error.log
access_log:
file_path:
logs/access.log # supports relative path, absolute path, standard output
# such as: logs/access.log, /tmp/logs/access.log, /dev/stdout, /dev/stderr
# such as absolute path on Windows: winfile:///C:\access.log
# log example: 2020-12-09T16:38:09.039+0800 INFO filter/logging.go:46 /apisix/admin/routes/r1 {"status": 401, "host": "127.0.0.1:9000", "query": "asdfsafd=adf&a=a", "requestId": "3d50ecb8-758c-46d1-af5b-cd9d1c820156", "latency": 0, "remoteIP": "127.0.0.1", "method": "PUT", "errs": []}
max_cpu: 0 # supports tweaking with the number of OS threads are going to be used for parallelism. Default value: 0 [will use max number of available cpu cores considering hyperthreading (if any)]. If the value is negative, is will not touch the existing parallelism profile.
authentication:
secret:
secret # secret for jwt token generation.
# NOTE: Highly recommended to modify this value to protect `manager api`.
# if it's default value, when `manager api` start, it will generate a random string to replace it.
expire_time: 3600 # jwt token expire time, in second
users: # yamllint enable rule:comments-indentation
- username: admin # username and password for login `manager api`
password: admin
plugins: # plugin list (sorted in alphabetical order)
- api-breaker
- authz-keycloak
- basic-auth
- batch-requests
- consumer-restriction
- cors
# - dubbo-proxy
- echo
# - error-log-logger
# - example-plugin
- fault-injection
- grpc-transcode
- hmac-auth
- http-logger
- ip-restriction
- jwt-auth
- kafka-logger
- key-auth
- limit-conn
- limit-count
- limit-req
# - log-rotate
# - node-status
- openid-connect
- prometheus
- proxy-cache
- proxy-mirror
- proxy-rewrite
- redirect
- referer-restriction
- request-id
- request-validation
- response-rewrite
- serverless-post-function
- serverless-pre-function
# - skywalking
- sls-logger
- syslog
- tcp-logger
- udp-logger
- uri-blocker
- wolf-rbac
- zipkin
- server-info
- traffic-split
使用Docker
docker pull apache/apisix-dashboard
docker run -d --name dashboard \
-p 9000:9000 \
-v <CONFIG_FILE>:/usr/local/apisix-dashboard/conf/conf.yaml \
apache/apisix-dashboard
<CONFIG_FILE> 就是配置文件的路径
RPM
安装
# 1. install RPM package
sudo yum install -y https://github.com/apache/apisix-dashboard/releases/download/v3.0.1/apisix-dashboard-3.0.1-0.el7.x86_64.rpm
启动
# run dashboard in the shell
sudo manager-api -p /usr/local/apisix/dashboard/
# or run dashboard as a service
systemctl start apisix-dashboard
访问Apisix Dashboard
默认情况下,Apisix Dashboard的控制面板端口为9000
,访问部署的ip:port
即可访问,如http://10.246.0.164:9000/,访问后进入登录界面
默认账号:admin
默认密码:admin
生产环境建议修改密码,在dashboard文件夹
conf/conf.yaml
中,修改authentication.users
配置
登录成功后进入dashboard的仪表板,这里可配置Grafana面板,需要注意的是,Grafana需要在配置文件设置allow_embedding=true
,官方文档说明
路由配置
说明:一般情况下,我习惯按
服务->上游->路由
的顺序配置路由,这样可以减少部分重复的配置工作,提高效率。Apisix也支持直接配置路由,根据实际需要进行配置。我会按服务->上游->路由
的顺序说明如何配置路由
服务配置
-
点击菜单中的
服务
即可进入服务列表界面,点击创建
即可新建服务 -
填写基本信息
-
填写域名后,只有通过指定域名或IP访问路由,才能正常访问,否则会返回404。如配置了域名为10.0.0.4,则只能通过http://10.0.0.4:port/xx/getId访问路由,如果通过http://10.0.0.5:port/xx/getId则返回
404
-
正常情况下,我通过
路由
绑定上游,所以不会在服务
绑定上游,这个配置可以根据实际情况调整,不过,如果在这里配置上游,也可以在配置路由时调整上游。
-
-
配置插件
一般我会默认开启
prometheus
插件,根据上图按顺序配置即可,其余插件根据实际需要进行配置。部分插件说明可看下文。-
配置信息
{ "prefer_name": true }
-
-
确认配置的信息后提交即可
上游配置
-
点击菜单中的
上游
即可进入上游列表界面,点击创建
即可创建上游 -
配置上游基础信息
按实际情况调整
发送超时
、接收超时
配置,如果超时时间配置过小,上游响应慢可能会导致503按需开启健康检查功能,可以配置HTTP或TCP类型,可以通过接口或端口监测判断上游是否健康,如果上游不健康,则路由不会转发至该不健康的上游。
此功能主要用于2个或以上上游的情况(即2个目标节点),如果只有1个上游,则健康检查功能不会生效。
-
确认配置的信息后提交即可
路由配置
-
点击菜单中的
路由
即可进入路由列表界面,点击创建
即可创建路由 -
配置路由基础信息
绑定服务选择刚刚创建的服务信息,可以根据需要自定义配置标签等其他信
-
配置匹配条件
-
填写路径信息,可以同时配置多个路径,多条相同前缀的路由,默认优先最长匹配
-
域名可以不写,交由服务统一配置即可,也可填写后覆盖服务中的配置
-
HTTP方法根据实际需要选择
-
-
配置请求改写
默认不改写,可根据实际需要配置,如剪除请求路径前缀
-
设置上游服务
如果已经在
服务
中设置了上游,可以使用不选择
,否则根据实际情况,选择已经配置了的上游服务 -
设置插件
一般我会默认开启
prometheus
插件,根据上图按顺序配置即可,其余插件根据实际需要进行配置。部分插件说明可看下文。-
配置信息
{ "prefer_name": true }
-
-
确认配置的信息后提交即可
证书配置
如果需要https访问,则需要将域名的证书添加到dashboard,apisix会自动拉取使用
-
点击菜单中的
证书
即可进入证书列表界面,点击创建
即可创建证书 -
完善证书信息
可以使用输入或上传的方式完善证书信息,使用符合nginx格式的证书即可
-
确认配置的信息后提交即可
插件配置
可以在多个地方配置插件,包括
全局
、服务
、路由
,优先级为路由>服务>上游
监控类
Promethues 监控数据
提供符合 prometheus 数据格式的监控指标数据
在可观测性类型中,找到
prometheus
插件,打开启用
后提交即可该插件可以设置参数:
prefer_name:在Prometheus数据中优先显示路由的名称
{ "prefer_name": true }
流量控制类
limit-conn 限制连接数
用于限制请求的连接数
在流量控制类型中,找到
limit-conn
插件,可配置插件,官方文档参数说明:
- conn:填写最大的连接数,最大请求数=最大连接数+缓冲连接数
- burst:填写最大的缓冲连接数,超过最大连接数,但小于最大连接数+缓冲连接数的请求,会被加上default_conn_delay处理延迟时间后请求
- default_conn_delay:处理延迟时间,单位秒
- only_use_default_delay:延迟时间的严格模式
- key_type:一般选
var
- key:一般填
remote_addr
(客户端地址)- rejected_code:一般用默认
503
- rejected_msg:一般填友好一点的提示语
limit-count 限制请求数
用于限制指定实际访问内的总请求个数
在流量控制类型中,找到
limit-count
插件,可配置插件,官方文档参数说明:
- count:最大的请求数量
- time_window:时间窗口,单位秒
- key_type:一般选
var
- key:一般填
remote_addr
(客户端地址)- rejected_code:一般用默认
503
- rejected_msg:一般填友好一点的提示语
- policy:如果有多个apisix节点,一般使用redis(redis单点)或redis-cluster(redis集群)
- redis_host:redis服务器的ip(policy为redis)
- redis_port:redis服务器的端口(policy为redis)
- redis_password:redis服务器的密码
- redis_database:redis服务器的数据库号(policy为redis)
- redis_timeout:redis连接超时时间
- redis_cluster_name:redis集群名称(policy为redis-cluster)
- redis_cluster_nodes:redis集群节点(policy为redis-cluster)
limit-req 限制QPS
使用漏桶算法,限制请求速度
在流量控制类型中,找到
limit-req
插件,可配置插件,官方文档参数说明:
- rate:填写指定的请求速率(秒),最大请求速率=指定请求速率+缓冲请求速率
- burst:填写缓冲请求速率(秒),超过指定请求速率+缓冲请求速率的请求,会被直接拒绝
- key_type:一般选
var
- key:一般填
remote_addr
(客户端地址)- rejected_code:一般用默认
503
- rejected_msg:一般填友好一点的提示语
安全防护类
cors 跨域请求头
CORS(Cross-Origin Resource Sharing,跨源资源共享)是浏览器的一种安全策略,用于限制从一个源(网站)发起的跨域请求访问另一个源的资源。该策略确保了资源只能被授权的域访问,从而保护了用户隐私和安全。实现CORS需要在服务端设置响应头Access-Control-Allow-Origin,告知浏览器哪些域可以访问资源。
服务端启用 CORS 的返回头
在安全防护类型类型中,找到
cors
插件,可配置插件,官方文档
ip-restriction IP访问限制
可以限制请的IP,加入黑名单或白名单
在安全防护类型类型中,找到
ip-restriction
插件,可配置插件,官方文档{ "whitelist": [ "127.0.0.1", "113.74.26.106/24" ], "blacklist": [ "127.0.0.1" ], "message": "Your IP address is not allowed" }
参数说明:
- whitelist:白名单
- blacklist:黑名单
- message:被限制后的提示信息
日志收集类
RocketMQ日志收集
将接口请求日志以 JSON 的形式推送给外部 rocketmq 集群,会在批处理处理器中的计时器功能到期后自动发送日志
在
可观测性
类型类型中,找到rocketmq-logger
插件,可配置插件,官方文档{ "nameserver_list" : [ "127.0.0.1:9876" ], "topic" : "test2", "key": "key", "tag": "tag", "include_req_body": false, "include_resp_body": false }
参数说明:
- nameserver_list:rocketmq的nameserver地址
- topic:推送的topic
- key:推送的key
- tag:推送的tag
- include_req_body:是否包含请求body
- include_resp_body:是否包含响应body
消息示例:
{ "upstream": "127.0.0.1:1980", "start_time": 1619414294760, "client_ip": "127.0.0.1", "service_id": "", "route_id": "1", "request": { "querystring": { "ab": "cd" }, "size": 90, "uri": "/hello?ab=cd", "url": "http://localhost:1984/hello?ab=cd", "headers": { "host": "localhost", "content-length": "6", "connection": "close" }, "body": "abcdef", "method": "GET" }, "response": { "headers": { "connection": "close", "content-type": "text/plain; charset=utf-8", "date": "Mon, 26 Apr 2021 05:18:14 GMT", "server": "APISIX/2.5", "transfer-encoding": "chunked" }, "size": 190, "status": 200 }, "server": { "hostname": "localhost", "version": "2.5" }, "latency": 0 }