前言

本文详细介绍了 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/,访问后进入登录界面

image-20230407102721647

默认账号:admin

默认密码:admin

生产环境建议修改密码,在dashboard文件夹conf/conf.yaml中,修改authentication.users配置

image-20230407102822529

登录成功后进入dashboard的仪表板,这里可配置Grafana面板,需要注意的是,Grafana需要在配置文件设置allow_embedding=true官方文档说明

image-20230407102848761

路由配置

说明:一般情况下,我习惯按服务->上游->路由的顺序配置路由,这样可以减少部分重复的配置工作,提高效率。Apisix也支持直接配置路由,根据实际需要进行配置。我会按服务->上游->路由的顺序说明如何配置路由

服务配置

  1. 点击菜单中的服务即可进入服务列表界面,点击创建即可新建服务

    image-20230407102938235

  2. 填写基本信息

    image-20230407103031762

    • 填写域名后,只有通过指定域名或IP访问路由,才能正常访问,否则会返回404。如配置了域名为10.0.0.4,则只能通过http://10.0.0.4:port/xx/getId访问路由,如果通过http://10.0.0.5:port/xx/getId则返回404

    • 正常情况下,我通过路由绑定上游,所以不会在服务绑定上游,这个配置可以根据实际情况调整,不过,如果在这里配置上游,也可以在配置路由时调整上游。

  3. 配置插件

    image-20230407103139261

    一般我会默认开启prometheus插件,根据上图按顺序配置即可,其余插件根据实际需要进行配置。部分插件说明可看下文。

    • 配置信息

      {
        "prefer_name": true
      }
      
  4. 确认配置的信息后提交即可

上游配置

  1. 点击菜单中的上游即可进入上游列表界面,点击创建即可创建上游

    image-20230407103216919

  2. 配置上游基础信息

    image-20230407103240116

    按实际情况调整发送超时接收超时配置,如果超时时间配置过小,上游响应慢可能会导致503

    image-20230407103339182

    按需开启健康检查功能,可以配置HTTP或TCP类型,可以通过接口或端口监测判断上游是否健康,如果上游不健康,则路由不会转发至该不健康的上游。

    此功能主要用于2个或以上上游的情况(即2个目标节点),如果只有1个上游,则健康检查功能不会生效。

  3. 确认配置的信息后提交即可

路由配置

  1. 点击菜单中的路由即可进入路由列表界面,点击创建即可创建路由

    image-20230407103446067

  2. 配置路由基础信息

    image-20230407103529978

    绑定服务选择刚刚创建的服务信息,可以根据需要自定义配置标签等其他信

  3. 配置匹配条件

    image-20230407103621678

    • 填写路径信息,可以同时配置多个路径,多条相同前缀的路由,默认优先最长匹配

    • 域名可以不写,交由服务统一配置即可,也可填写后覆盖服务中的配置

    • HTTP方法根据实际需要选择

  4. 配置请求改写

    image-20230407103639894

    默认不改写,可根据实际需要配置,如剪除请求路径前缀

    image-20230407103848969

  5. 设置上游服务

    image-20230407103915021

    如果已经在服务中设置了上游,可以使用不选择,否则根据实际情况,选择已经配置了的上游服务

  6. 设置插件

    image-20230407103139261

    一般我会默认开启prometheus插件,根据上图按顺序配置即可,其余插件根据实际需要进行配置。部分插件说明可看下文。

    • 配置信息

      {
        "prefer_name": true
      }
      
  7. 确认配置的信息后提交即可

证书配置

如果需要https访问,则需要将域名的证书添加到dashboard,apisix会自动拉取使用

  1. 点击菜单中的证书即可进入证书列表界面,点击创建即可创建证书

    image-20230407104018670

  2. 完善证书信息

    image-20230407104034201

    可以使用输入或上传的方式完善证书信息,使用符合nginx格式的证书即可

  3. 确认配置的信息后提交即可

插件配置

可以在多个地方配置插件,包括全局服务路由,优先级为路由>服务>上游

监控类

Promethues 监控数据

image-20230407103139261

提供符合 prometheus 数据格式的监控指标数据

在可观测性类型中,找到prometheus插件,打开启用后提交即可

该插件可以设置参数:

  • prefer_name:在Prometheus数据中优先显示路由的名称

    {
      "prefer_name": true
    }
    

流量控制类

limit-conn 限制连接数

image-20230407104220367

用于限制请求的连接数

在流量控制类型中,找到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 限制请求数

image-20230407104239093

用于限制指定实际访问内的总请求个数

在流量控制类型中,找到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

image-20230407104255295

使用漏桶算法,限制请求速度

在流量控制类型中,找到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,告知浏览器哪些域可以访问资源。

image-20230407104321467

服务端启用 CORS 的返回头

在安全防护类型类型中,找到cors插件,可配置插件,官方文档

ip-restriction IP访问限制

image-20230407104343978

可以限制请的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日志收集

image-20230407104406949

将接口请求日志以 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
}

参考文档

  1. 在 Apache APISIX 中,我如何在转发到上游之前从路径中删除一个前缀?
  2. configure-grafana
  3. CORS
  4. Basic Deploy