Apache APISIX最佳实践(二):配置详解与路由配置

2024-08-30 17:01:22 浏览数 (1)

在上一章节介绍中,我们已经大致了解了 Apache APISIX 的基本架构与安装。本次,我们将深入解读其配置和介绍如何使用Admin API 进行路由管理。

01、配置详解

我们就拿上一章节的APISIX ConfigMap配置来进行解读,APISIX的配置名为config.yaml 文件,通常位于 /usr/local/apisix/conf/config.yaml,关键配置如下:

  • 基本监听和模式设置
代码语言:javascript复制
apisix:    # 通用配置
  node_listen:    # APISIX 监听端口,默认端口是9080
    - 9080
  enable_heartbeat: true  # 启用心跳检查
  enable_admin: true       # 启用管理 API
  enable_admin_cors: true  # 允许跨域资源共享(CORS)请求管理 API
  enable_debug: false      # 禁用调试模式

  enable_dev_mode: false   # 如果设置为 true,则将 nginx worker_processes 设置为 1
  enable_reuseport: true   # 如果设置为 true,则启用 nginx 的 SO_REUSEPORT 开关
  enable_ipv6: true        # 启用 nginx IPv6 解析支持
  enable_http2: true       # 启用 HTTP/2
  enable_server_tokens: true # 是否在 Server 响应头中显示 APISIX 版本号
  • 代理和路由设置
代码语言:javascript复制
proxy_cache:                         # 代理缓存配置
    cache_ttl: 10s                    # 如果上游未指定缓存时间,则默认的缓存时间
    zones:                            # 缓存区域的参数
    - name: disk_cache_one            # 缓存的名称,管理员可以通过名称在管理 API 中指定使用哪个缓存
      memory_size: 50m                # 共享内存的大小,用于存储缓存索引
      disk_size: 1G                   # 磁盘的大小,用于存储缓存数据
      disk_path: "/tmp/disk_cache_one" # 存储缓存数据的路径
      cache_levels: "1:2"             # 缓存的层级结构

router:  # 路由配置
  http: radixtree_host_uri  # 使用基于基数树的算法,通过 host 和 uri 组合来匹配路由
  ssl: 'radixtree_sni'      # 使用基于基数树的算法,通过 SNI (Server Name Indication) 来匹配 SSL/TLS 请求的路由

proxy_mode: http # 代理模式,设置为http

stream_proxy:                 # TCP/UDP 代理
  tcp:                        # TCP 代理端口列表
    - 9100
  udp:                        # UDP 代理端口列表
    - 9200
  • SSL 配置,建议是要开启HTTPS的,可以在dashboard上面进行配置
代码语言:javascript复制
ssl:
  enable: false                  # 是否启用 SSL 功能
  listen:
    - port: 9443                 # SSL 监听端口
      enable_http3: false        # 是否启用 HTTP/3
  ssl_protocols: "TLSv1.2 TLSv1.3"  # 启用的 SSL 协议版本
  ssl_ciphers: "..."             # 支持的加密套件列表
  • Nginx特定配置,前面我们也讲到APISIX是基于Nginx引擎进行开发的,在很多云原生的网关中,我们都可以发现Nginx的身影,哈哈。
代码语言:javascript复制
nginx_config:
  error_log: "/dev/stderr"  # 错误日志输出位置
  error_log_level: "warn"   # 错误日志级别
  worker_processes: "auto"  # 工作进程数量
  enable_cpu_affinity: true # 启用 CPU 亲和性
  worker_rlimit_nofile: 20480  # 单个工作进程的最大文件描述符数量
  event:
    worker_connections: 10620  # 单个工作进程的最大客户端连接数
  http:
    enable_access_log: true    # 启用访问日志
    access_log: "/dev/stdout"  # 访问日志输出位置
    access_log_format: '...'   # 访问日志格式
    access_log_format_escape: default  # 访问日志转义设置
    keepalive_timeout: "60s"   # 保持连接的最大空闲时间
    client_header_timeout: 60s # 客户端请求头读取超时
    client_body_timeout: 60s   # 客户端请求体读取超时
    send_timeout: 10s          # 响应发送超时
    underscores_in_headers: "on"  # 允许请求头使用下划线
    real_ip_header: "X-Real-IP"   # 用于获取客户端真实 IP 的请求头
    real_ip_from:                 # 可信任的 IP 来源列表
      - 127.0.0.1
      - 'unix:'
  • 部署和管理
代码语言:javascript复制
deployment:
  role: traditional  # 定义部署角色为传统模式,通常意味着直接与配置存储(如etcd)连接。
  role_traditional:
    config_provider: etcd  # 指定配置数据的提供者,这里使用etcd作为配置中心。

  admin:
    allow_admin:
      - 127.0.0.1/24  # 允许来自本地网络的访问Admin API。
      - 0.0.0.0/0      # 允许来自任何IP的访问,建议在生产环境中限制此设置以提高安全性。
    admin_listen:
      ip: 0.0.0.0      # Admin API监听的IP地址,0.0.0.0表示监听所有IP地址。
      port: 9180       # Admin API监听的端口。
    admin_key:
      - name: "admin"
        key: edd1c9f034335f136f87ad84b625c8f1  # 管理员密钥,应在生产环境中更改以保障安全。
        role: admin  # 管理员角色,具有完全的管理权限。
      - name: "viewer"
        key: 4054f7cf07e344346cd3f287985e76a2  # 查看者密钥,应在生产环境中更改以保障安全。
        role: viewer  # 查看者角色,只能查看配置数据。

  etcd:
    host:
      - "http://apisix-etcd.apisix.svc.cluster.local:2379"  # etcd服务的地址,支持配置多个地址以实现高可用。
    prefix: "/apisix"  # etcd中用于存储APISIX配置数据的前缀。
    timeout: 30  # 与etcd通信的超时时间,单位为秒。

02、Admin API 管理路由

APISIX Admin API 是一个用于管理 APISIX 网关配置的 API 接口。通过 Admin API,我们可以动态地添加、修改或删除路由、服务、消费者等配置,无需重启服务。这使得 APISIX 非常适合在动态环境中使用,如持续部署和微服务架构。

添加路由

要通过 Admin API 添加路由,可以发送一个 POST 请求到 /apisix/admin/routes。以下是一个示例请求,它定义了一个路由,该路由将所有到 /hello 的请求转发到指定的上游服务。

代码语言:javascript复制
POST /apisix/admin/routes HTTP/1.1
Host: <Admin_API_Host>:9180
Content-Type: application/json
X-API-KEY: <Your_Admin_API_Key>

{
  "uri": "/hello",
  "methods": ["GET", "POST"],  # 允许通过GET和POST方法访问
  "upstream": {
    "type": "roundrobin",  # 使用轮询负载均衡
    "nodes": {
      "192.168.1.101:80": 1  # 上游服务器地址及其权重
    }
  }
}

修改路由

修改路由的操作类似,但需要知道要修改的路由ID。首先,可以通过 GET 请求列出所有路由以找到特定路由的ID。之后,使用 PUT 请求对指定ID的路由进行修改。

代码语言:javascript复制
PUT /apisix/admin/routes/<route_id> HTTP/1.1
Host: <Admin_API_Host>:9180
Content-Type: application/json
X-API-KEY: <Your_Admin_API_Key>

{
  "uri": "/hello",
  "methods": ["GET"],  # 修改为只允许GET方法
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "192.168.1.100:80": 2,
      "192.168.1.101:80": 8  # 添加新的上游节点
    }
  }
}

注释

  • X-API-KEY: 这是用于验证请求的密钥。在生产环境中,应确保这个密钥是保密的,并且定期更换以增强安全性。
  • uri: 指定路由的 URI 模式。所有匹配此模式的请求都将被路由到指定的上游。
  • methods: 定义允许哪些 HTTP 方法通过此路由。这是一个可选字段,如果未设置,默认允许所有方法。
  • upstream: 定义路由的上游服务信息,包括负载均衡策略和上游节点。
  • nodes: 在 upstream 下的 nodes 字段定义了上游服务器的地址及其权重。权重决定了各个节点处理请求的比例。

03、总 结

好的,这章我们了解了APISIX的配置和路由管理,下一章节我们将通过实际案例对APISIX进行更加深入的探索,敬请期待~

0 人点赞