APISIX-00-总览

0. 摘要

项目目标

Apache APISIX 是一个动态、实时、高性能的云原生 API 网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。核心目标是为微服务架构提供统一的 API 管理和流量处理能力。

问题域与核心能力

  • 动态路由:基于 URI、方法、Header、参数等条件的路由匹配
  • 负载均衡:支持 Round Robin、一致性哈希、加权轮询、最少连接等策略
  • 插件机制:热插拔式插件系统,支持认证、限流、日志、转换等 150+ 插件
  • 服务发现:集成 Consul、Eureka、Nacos、Kubernetes 等服务注册中心
  • 多协议支持:HTTP(S)、HTTP/2、HTTP/3、gRPC、TCP/UDP、WebSocket、MQTT
  • 动态配置:通过 Admin API 或 YAML 配置,秒级生效无需重启
  • 高性能:基于 OpenResty/Nginx,单核 QPS 可达 2.3 万

非目标

  • 不提供服务注册功能(仅服务发现)
  • 不是完整的 Service Mesh 数据面(但可作为 Ingress Controller)
  • 不包含完整的服务治理控制台(需配合 Dashboard 使用)

运行环境

  • 语言:Lua (LuaJIT)
  • 运行时:OpenResty (基于 Nginx + LuaJIT)
  • 依赖:etcd v3(配置中心)、LuaRocks(包管理)
  • 支持平台:Linux、macOS、容器化环境

部署形态

  • 传统部署:独立进程,通过 Admin API 管理
  • Kubernetes Ingress Controller:作为 K8s 入口网关
  • Standalone 模式:基于 YAML 配置文件,无需 etcd
  • 混合部署:Control Plane 与 Data Plane 分离

1. 整体架构图

flowchart TB
    Client[客户端请求] --> APISIX[APISIX 网关]

    APISIX --> Init[初始化模块<br/>init.lua]
    APISIX --> Router[路由模块<br/>router.lua]
    APISIX --> Plugin[插件系统<br/>plugin.lua]

    Init --> Core[核心工具模块<br/>core/]
    Init --> Config[配置中心<br/>etcd/yaml]

    Router --> HTTPRoute[HTTP路由<br/>http/route.lua]
    Router --> StreamRoute[Stream路由<br/>stream/]

    HTTPRoute --> Match{路由匹配}
    Match -->|匹配成功| Service[服务对象]
    Match -->|匹配失败| NotFound[404响应]

    Service --> PluginExec[插件执行]
    PluginExec --> GlobalRules[全局规则]
    PluginExec --> RoutePlugins[路由插件]
    PluginExec --> ConsumerPlugins[消费者插件]

    PluginExec --> Upstream[上游选择<br/>upstream.lua]
    Upstream --> Discovery[服务发现<br/>discovery/]
    Upstream --> Balancer[负载均衡<br/>balancer.lua]

    Balancer --> PickNode{选择节点}
    PickNode --> HealthCheck[健康检查]
    PickNode --> Strategy[负载均衡策略]

    Strategy --> RoundRobin[轮询]
    Strategy --> CHash[一致性哈希]
    Strategy --> LeastConn[最少连接]
    Strategy --> EWMA[EWMA]

    PickNode --> Backend[后端服务]
    Backend --> Response[响应处理]
    Response --> Client

    Config --> Admin[Admin API<br/>admin/]
    Admin --> Routes[路由管理<br/>routes.lua]
    Admin --> Services[服务管理<br/>services.lua]
    Admin --> Upstreams[上游管理<br/>upstreams.lua]
    Admin --> SSL[证书管理<br/>ssl.lua]
    Admin --> Consumers[消费者管理<br/>consumers.lua]

    Plugin --> PluginLoader[插件加载器]
    Plugin --> PluginFilter[插件过滤器]
    Plugin --> PluginRunner[插件执行器]

    APISIX --> SSL_TLS[SSL/TLS处理<br/>ssl.lua]
    SSL_TLS --> ClientHello[Client Hello阶段]
    SSL_TLS --> SNI[SNI匹配]
    SSL_TLS --> MTLS[mTLS验证]

    APISIX --> Control[Control API<br/>control/]
    Control --> HealthStatus[健康检查]
    Control --> Schema[Schema查询]
    Control --> Config查询[配置查询]

    style APISIX fill:#4A90E2,color:#fff
    style Init fill:#E8F4F8
    style Router fill:#E8F4F8
    style Plugin fill:#E8F4F8
    style Upstream fill:#E8F4F8
    style Admin fill:#FFF4E6
    style SSL_TLS fill:#F0F0F0

架构说明

1.1 核心分层

请求处理层

  • init.lua:APISIX 入口模块,定义 OpenResty 各个执行阶段的处理函数(init、init_worker、ssl_client_hello、access、balancer、header_filter、body_filter、log)
  • router.lua:路由分发器,根据子系统(HTTP/Stream)选择对应的路由实现

路由匹配层

  • http/route.lua:HTTP 路由实现,基于 radixtree 或自定义 router 进行快速匹配
  • stream/router/ip_port.lua:Stream 路由实现,基于 IP:Port 四层匹配
  • 匹配维度:URI、Method、Host、Remote Addr、Vars(Nginx 变量)、Filter Function(自定义 Lua 函数)

插件执行层

  • plugin.lua:插件管理核心,负责插件加载、schema 校验、优先级排序、阶段执行
  • 插件执行顺序:全局规则 → 路由插件 → 消费者插件 → 消费者组插件
  • 支持自定义优先级和条件过滤(meta.filter、meta.pre_function)

上游代理层

  • upstream.lua:上游配置管理,支持静态节点、服务发现、DNS 解析
  • balancer.lua:负载均衡核心,封装不同策略的选择器
  • discovery/:服务发现模块,对接多种注册中心

1.2 配置管理

配置来源

  • etcd:生产环境推荐,支持配置热更新、分布式一致性
  • YAML:Standalone 模式,适合边缘场景或测试环境
  • XDS (Envoy API):实验性支持,与 Istio 等集成

配置对象

  • Route:路由规则,定义匹配条件、插件、上游
  • Service:服务抽象,可被多个路由引用
  • Upstream:上游节点集合,定义负载均衡策略
  • Consumer:消费者身份,用于认证和授权
  • Plugin Config:插件配置复用
  • Global Rules:全局插件规则
  • SSL:TLS 证书配置

1.3 Admin API 层

提供 RESTful API 管理所有配置对象:

  • admin/routes.lua:路由 CRUD
  • admin/services.lua:服务 CRUD
  • admin/upstreams.lua:上游 CRUD
  • admin/ssl.lua:证书 CRUD
  • admin/consumers.lua:消费者 CRUD
  • admin/plugin_metadata.lua:插件元数据管理
  • admin/global_rules.lua:全局规则管理

1.4 Control API 层

运行时监控和调试接口(默认端口 9090):

  • /v1/schema:查询 Schema 定义
  • /v1/healthcheck:健康检查状态
  • /v1/routes:运行时路由信息
  • /v1/services:运行时服务信息
  • /v1/gc:触发 Lua GC

1.5 核心工具模块 (core/)

  • config:配置加载与监听(etcd/yaml/xds)
  • log:日志工具(支持不同级别)
  • json:JSON 编解码(优先使用 cjson)
  • table:表操作扩展(deepcopy、clone、insert等)
  • request:请求工具(获取 body、header、参数)
  • response:响应工具(设置状态码、body、header)
  • lrucache:LRU 缓存(基于 lua-resty-lrucache)
  • schema:Schema 定义与校验(基于 jsonschema)
  • ctx:请求上下文管理
  • ip:IP 解析与匹配(支持 CIDR)
  • etcd:etcd 客户端封装
  • event:事件总线

2. 全局时序图

2.1 HTTP 请求完整处理流程

sequenceDiagram
    autonumber
    participant Client as 客户端
    participant Nginx as Nginx/OpenResty
    participant Init as init.lua
    participant Router as 路由系统
    participant Plugin as 插件系统
    participant Upstream as 上游管理
    participant Balancer as 负载均衡器
    participant Backend as 后端服务

    Note over Client,Backend: === SSL/TLS 握手阶段 (HTTPS) ===
    Client->>Nginx: Client Hello (SNI)
    Nginx->>Init: ssl_client_hello_phase()
    Init->>Router: router_ssl.match_and_set(sni)
    Router-->>Init: 匹配SSL证书
    Init->>Init: 设置SSL协议和密码套件
    Init-->>Nginx: 证书就绪
    Nginx-->>Client: Server Hello + 证书

    Note over Client,Backend: === SSL 握手完成 ===
    Nginx->>Init: ssl_phase()
    Init->>Init: verify_https_client()<br/>验证客户端证书(mTLS)

    Note over Client,Backend: === HTTP 请求处理阶段 ===
    Client->>Nginx: HTTP Request<br/>GET /api/users?id=123
    Nginx->>Init: http_access_phase()

    Init->>Init: 创建 api_ctx 上下文
    Init->>Init: normalize URI<br/>处理尾部斜杠、servlet风格URI
    Init->>Init: handle_x_forwarded_headers()<br/>处理 X-Forwarded-* 头部

    Init->>Router: router_http.match(api_ctx)
    Router->>Router: radixtree匹配路由<br/>维度: URI+Method+Host+Vars
    Router-->>Init: matched_route

    alt 路由未匹配
        Init->>Plugin: run_global_rules()<br/>执行全局规则
        Init-->>Client: 404 Not Found
    end

    Init->>Init: 合并 plugin_config
    Init->>Init: 合并 service 配置
    Init->>Plugin: run_global_rules(global_rules)
    Plugin->>Plugin: 执行全局插件的 rewrite 和 access 阶段

    alt 使用 script (脚本路由)
        Init->>Plugin: script.run("access")
        Plugin-->>Init: 执行自定义脚本
    else 使用标准插件
        Init->>Plugin: plugin.filter(route)<br/>筛选激活的插件
        Plugin->>Plugin: 按优先级排序插件
        Plugin-->>Init: plugins 数组

        Init->>Plugin: plugin.run_plugin("rewrite", plugins)
        loop 遍历每个插件
            Plugin->>Plugin: 执行 plugin.rewrite(conf, api_ctx)
            Plugin->>Plugin: 可能修改请求 URI、参数、Header
        end

        alt 有 consumer (认证通过)
            Init->>Plugin: merge_consumer_route()<br/>合并消费者插件
            Init->>Plugin: run_plugin("rewrite_in_consumer")
        end

        Init->>Plugin: plugin.run_plugin("access", plugins)
        loop 遍历每个插件
            Plugin->>Plugin: 执行 plugin.access(conf, api_ctx)
            alt 插件返回错误码
                Plugin-->>Client: 4xx/5xx 响应 + body
            end
        end
    end

    Note over Init,Upstream: === 上游选择与负载均衡 ===
    Init->>Upstream: handle_upstream(api_ctx, route)

    alt 有 upstream_id
        Upstream->>Upstream: get_by_id(upstream_id)
    else 有 service_id
        Upstream->>Upstream: 从 service 获取 upstream
    else 直接配置 upstream
        Upstream->>Upstream: 使用 route.upstream
    end

    alt 服务发现
        Upstream->>Upstream: discovery.nodes(service_name)
        Upstream->>Upstream: 比较节点变更<br/>parse_domain_in_route()
    end

    Upstream->>Upstream: set_upstream_scheme(api_ctx)<br/>设置协议 (http/https/grpc/grpcs)
    Upstream->>Upstream: fill_node_info()<br/>填充端口和优先级
    Upstream->>Upstream: 初始化健康检查器

    alt 需要 mTLS 到上游
        Upstream->>Upstream: set_upstream_tls_client_param()<br/>设置客户端证书
    end

    Upstream->>Balancer: pick_server(route, api_ctx)
    Balancer->>Balancer: 获取或创建 server_picker

    alt 多节点负载均衡
        Balancer->>Balancer: fetch_health_nodes()<br/>过滤健康节点
        Balancer->>Balancer: 选择负载均衡策略<br/>(roundrobin/chash/ewma/least_conn)
        Balancer->>Balancer: picker.get(ctx)<br/>选择目标节点
    else 单节点
        Balancer->>Balancer: 直接返回唯一节点
    end

    Balancer-->>Init: picked_server {host, port}
    Init->>Init: set_upstream_headers()<br/>设置 upstream_host
    Init->>Plugin: common_phase("before_proxy")

    alt gRPC/gRPCs 协议
        Init->>Nginx: ngx.exec("@grpc_pass")
    else Dubbo 协议
        Init->>Nginx: ngx.exec("@dubbo_pass")
    end

    Note over Nginx,Backend: === Balancer 阶段 (每次重试都执行) ===
    Nginx->>Init: http_balancer_phase()
    Init->>Balancer: balancer.run(api_ctx)

    alt 首次请求
        Balancer->>Balancer: 使用 access 阶段已选节点
        Balancer->>Balancer: set_balancer_opts()<br/>设置超时、重试次数
    else 重试请求
        Balancer->>Balancer: 检查 retry_timeout 是否超时
        Balancer->>Balancer: 上报上次失败到健康检查器
        Balancer->>Balancer: pick_server() 重新选择节点
        Balancer->>Plugin: 重新执行 before_proxy 插件
    end

    Balancer->>Balancer: set_current_peer(server)<br/>设置连接池和 Keepalive
    Balancer->>Backend: 代理请求到 host:port

    Backend-->>Nginx: 响应 (状态码 + Header + Body)

    Note over Nginx,Client: === Header Filter 阶段 ===
    Nginx->>Init: http_header_filter_phase()
    Init->>Init: 设置 Server 头部 (APISIX/<version>)
    Init->>Init: 设置 X-APISIX-Upstream-Status
    Init->>Plugin: common_phase("header_filter")
    Plugin->>Plugin: 执行各插件的 header_filter 方法

    Note over Nginx,Client: === Body Filter 阶段 ===
    Nginx->>Init: http_body_filter_phase()
    Init->>Plugin: common_phase("body_filter")
    Plugin->>Plugin: 执行各插件的 body_filter 方法<br/>可能修改响应体
    Init->>Plugin: common_phase("delayed_body_filter")

    Nginx-->>Client: HTTP Response<br/>200 OK + Headers + Body

    Note over Nginx,Client: === Log 阶段 ===
    Nginx->>Init: http_log_phase()
    Init->>Plugin: common_phase("log")
    Plugin->>Plugin: 执行各插件的 log 方法<br/>记录日志、指标上报
    Init->>Init: healthcheck_passive()<br/>被动健康检查
    Init->>Init: 释放资源<br/>tablepool.release(api_ctx)

图解说明

2.1.1 SSL/TLS 处理要点

  • ssl_client_hello_phase:在 TLS 握手的 Client Hello 阶段触发,用于 SNI 匹配 SSL 证书
  • SNI 匹配:通过 router_ssl.match_and_set() 查找匹配 snisnis 字段的 SSL 对象
  • 协议设置:根据 SSL 配置的 ssl_protocols 字段设置 TLS 版本(TLSv1.2, TLSv1.3 等)
  • mTLS:如果配置了 client 字段,则验证客户端证书,支持 skip_mtls_uri_regex 跳过特定路径
  • ssl_phase:在 TLS 握手完成后执行,用于最终验证和设置

2.1.2 路由匹配维度

  • URI:基于 radixtree 前缀匹配,支持通配符和参数捕获
  • Method:HTTP 方法(GET、POST、PUT、DELETE 等)
  • Host:域名匹配,支持泛域名(*.example.com)
  • Remote Addr:客户端 IP 或 CIDR 匹配
  • Vars:Nginx 变量表达式匹配(如 arg_idhttp_user_agent 等)
  • Filter Function:自定义 Lua 函数动态过滤
  • Priority:优先级,数值越大优先级越高

2.1.3 插件执行阶段

阶段 OpenResty 阶段 说明
rewrite rewrite_by_lua 请求重写,修改 URI、参数、Header
access access_by_lua 访问控制,认证、授权、限流
before_proxy access_by_lua 代理前处理,最后机会修改请求
header_filter header_filter_by_lua 响应头过滤,添加或修改响应头
body_filter body_filter_by_lua 响应体过滤,转换响应内容
delayed_body_filter body_filter_by_lua 延迟的 body_filter,在 body_filter 后执行
log log_by_lua 日志记录,指标上报,不能修改响应

2.1.4 负载均衡策略

  • roundrobin (加权轮询):按权重顺序轮询,默认策略
  • chash (一致性哈希):基于请求特征(如 Header、Cookie、Consumer)哈希到固定节点
  • ewma (指数加权移动平均):基于延迟动态选择最快节点
  • least_conn (最少连接):选择当前连接数最少的节点

2.1.5 重试机制

  • 触发条件:连接失败、超时、5xx 错误
  • 重试次数upstream.retries 或节点数减一
  • 重试超时upstream.retry_timeout,避免无限重试
  • 节点选择:每次重试重新调用 pick_server(),避开失败节点
  • 健康检查联动:失败节点上报到健康检查器,被动标记为不健康

2.1.6 异常处理

  • 路由未匹配:返回 404,仍执行全局规则插件
  • 插件返回错误码:中断后续插件执行,直接返回响应
  • 上游不可用:返回 502 Bad Gateway
  • 负载均衡失败:返回 502,记录详细错误日志
  • 健康检查:主动探测(定时器)+ 被动检查(请求失败)

2.1.7 性能优化要点

  • 对象池api_ctxpluginsmatch_opts 等使用 tablepool 复用,减少 GC
  • LRU 缓存:路由匹配结果、插件配置、上游选择器等缓存
  • 惰性初始化:插件在首次使用时加载,避免启动时加载全部插件
  • Keepalive 连接池:上游连接复用,按 scheme#host#port#sni 分池
  • JIT 优化:关键路径代码优化 LuaJIT trace,避免 NYI(Not Yet Implemented)操作

3. 模块边界与交互矩阵

3.1 核心模块清单

模块名称 路径 主要职责 对外接口
初始化模块 init.lua 定义 OpenResty 各阶段回调,协调各模块 http_init(), http_init_worker(), http_access_phase() 等
核心工具模块 core/ 提供基础工具函数(log、json、table、request、response) core.log, core.json, core.table 等
配置模块 core/config_* 配置加载与热更新(etcd/yaml/xds) core.config.new(), core.config.local_conf()
路由模块 router.lua, http/route.lua 路由匹配与分发 router_http.match(), router_ssl.match_and_set()
插件系统 plugin.lua 插件加载、执行、schema 校验 plugin.load(), plugin.run_plugin(), plugin.filter()
上游管理 upstream.lua 上游配置管理、服务发现 upstream.set_by_route(), upstream.get_by_id()
负载均衡 balancer.lua, balancer/* 节点选择与负载均衡策略 balancer.pick_server(), balancer.run()
服务发现 discovery/* 对接注册中心(Consul、Eureka、Nacos、K8s) discovery.nodes(service_name)
SSL/TLS ssl.lua, ssl/router/* 证书管理、SNI 匹配、mTLS ssl.server_name(), ssl.match_and_set()
Admin API admin/* 配置管理 RESTful API routes.lua, services.lua, upstreams.lua 等
Control API control/* 运行时监控与调试 API v1.lua (schema, healthcheck, routes)
Stream 处理 stream/* TCP/UDP 代理、xRPC stream_init_worker(), stream_preread_phase()
CLI 工具 cli/* 命令行管理工具 apisix start/stop/reload 等
密钥管理 secret/* 外部密钥集成(AWS、GCP、Vault) secret.fetch_secret()
健康检查 healthcheck_manager.lua 主动与被动健康检查 fetch_checker(), report_http_status()
消费者管理 consumer.lua 消费者身份与认证 consumer.init_worker(), consumer.get()
全局规则 global_rules.lua 全局插件规则管理 global_rules.global_rules()
资源管理 resource.lua DNS 节点版本管理 resource.get_nodes_ver(), resource.set_nodes_ver_and_nodes()

3.2 模块交互矩阵

调用方 ↓ \ 被调方 → core config router plugin upstream balancer discovery admin ssl
init.lua -
router.lua - - - - -
plugin.lua - - - - - -
upstream.lua - - - - -
balancer.lua - - - - - - -
admin/* - - - - - -
http/route.lua - - - - - -
ssl.lua - - - - - - -

符号说明

  • ●:直接同步调用
  • ◐:异步调用或事件通知
  • -:无直接依赖

3.3 交互说明

init.lua → 各模块

  • 同步调用:在各 OpenResty 阶段按顺序调用对应模块
  • 错误语义:任何模块返回错误码时中断请求,返回对应 HTTP 状态码
  • 一致性要求:各模块应保证幂等性,支持多次调用(如重试场景)

router.lua → plugin.lua

  • 调用点:路由匹配后,过滤激活的插件列表
  • 数据传递:传递 route 配置对象,插件系统根据 route.value.plugins 过滤
  • 异步性:同步调用,阻塞等待插件过滤完成

upstream.lua → discovery

  • 调用点:当 upstream 配置了 service_namediscovery_type 时触发
  • 数据传递:传递服务名和发现参数,返回节点列表
  • 异步性:同步调用,但 discovery 模块内部可能缓存节点,避免频繁请求注册中心
  • 一致性:比较节点变更,仅在节点变化时更新 up_conf.nodes

balancer.lua → upstream.lua

  • 调用点:balancer 阶段选择目标节点时
  • 数据传递:传递 api_ctx,从中获取 upstream_conf
  • 异步性:同步调用
  • 一致性:负载均衡器内部维护节点选择状态,支持重试时换节点

admin/* → core.config

  • 调用点:Admin API 修改配置时
  • 数据传递:通过 etcd 写入配置,core.config 监听 etcd 变更
  • 异步性:异步更新,etcd watch 机制触发配置重载
  • 一致性:强一致性(etcd 保证)

plugin.lua → plugin.* (各插件)

  • 调用点:插件执行器遍历插件列表,调用各插件的阶段方法
  • 数据传递:传递插件配置 conf 和请求上下文 api_ctx
  • 异步性:同步调用,插件可以调用 ngx.exit() 中断请求
  • 一致性:插件应保证幂等性,不依赖全局状态

4. 关键设计与权衡

4.1 数据一致性

强一致性(etcd 配置)

  • 机制:通过 etcd watch 机制监听配置变更,Raft 协议保证一致性
  • 范围:Route、Service、Upstream、Consumer、SSL、Plugin Config 等配置对象
  • 权衡:牺牲部分可用性(etcd 不可用时无法变更配置),换取配置强一致性

最终一致性(服务发现)

  • 机制:定期从注册中心拉取节点列表,或通过 watch 机制获取变更
  • 范围:从 Consul、Eureka、Nacos、Kubernetes 等获取的节点信息
  • 权衡:节点变更可能有秒级延迟,但避免每次请求都查询注册中心

无状态设计

  • 原则:APISIX 不维护任何持久化状态,所有状态存储在 etcd
  • 好处:任意实例可替换,水平扩展简单,无需会话同步
  • 例外:插件可能在本地缓存数据(如 limit-count),通过 Redis 等外部存储实现分布式一致性

4.2 事务边界

配置变更

  • 原子性:单个配置对象的变更是原子的(etcd 单 key 更新)
  • 非原子:多个对象变更(如同时更新 route 和 upstream)不保证原子性
  • 建议:通过 service 对象抽象,减少跨对象依赖

请求处理

  • 无事务:每个请求独立处理,不涉及事务
  • 幂等性:插件应设计为幂等,重试不会产生副作用(除非插件自行处理)

4.3 锁与并发策略

配置读写

  • 读无锁:使用 LRU 缓存 + 版本号机制,读配置无需加锁
  • 写串行:etcd watch 回调在单个 worker 中串行执行,避免并发修改

插件执行

  • 无锁:每个请求独立的 api_ctx,插件间无共享状态
  • 并发控制插件:如 limit-count、limit-conn,通过 lua-resty-limit-traffic 实现令牌桶或漏桶算法

负载均衡器

  • 无锁选择器:roundrobin、chash 等策略使用无锁算法
  • 健康检查:通过 lua-resty-healthcheck,内部使用共享内存 + CAS 操作

4.4 性能关键路径

P99 延迟优化

  • 热路径代码:init.lua 的 http_access_phase()http_balancer_phase() 是最热路径
  • 对象复用api_ctxpluginsmatch_opts 使用 tablepool 复用,减少 GC 停顿
  • 缓存策略:路由匹配结果、插件配置、上游选择器均使用 LRU 缓存
  • JIT 优化:避免创建大量临时对象,减少 trace abort

内存峰值控制

  • 对象池大小api_ctx 初始 32 个槽位,plugins 初始 32 个元素
  • LRU 缓存上限:默认路由缓存 512 个条目,上游选择器缓存 256 个
  • 共享内存:健康检查、限流插件使用 shared dict,避免每个 worker 独立存储

I/O 热点

  • etcd 连接复用:使用长连接 + watch 机制,避免短连接开销
  • 上游连接池:按 scheme#host#port#sni 分池,Keepalive 复用连接
  • DNS 缓存:解析结果缓存,TTL 默认 30 秒

4.5 可观测性指标

关键指标

  • 请求量:总请求数、各路由/服务的请求数
  • 延迟:P50、P95、P99 延迟(包含 APISIX 内部耗时和上游响应时间)
  • 错误率:4xx、5xx 错误数,上游连接失败数
  • 上游健康度:健康节点数、不健康节点数、健康检查成功率

观测手段

  • Prometheus 插件:暴露 /apisix/prometheus/metrics 端点
  • 日志插件:http-logger、kafka-logger、syslog 等
  • OpenTelemetry 插件:分布式链路追踪
  • Control API:运行时状态查询

4.6 配置项与可变参数

核心配置 (config.yaml)

deployment 部分

  • role:data_plane / control_plane / traditional(默认 traditional)
  • config_provider:etcd / yaml / xds(默认 etcd)
  • admin.enable_admin_cors:Admin API 跨域支持

apisix 部分

  • node_listen:监听端口(默认 9080 / 9443)
  • enable_control:Control API 开关(默认 true,端口 9090)
  • enable_admin:Admin API 开关(默认 true,端口 9180)
  • router.http:路由实现(radixtree_uri / radixtree_uri_with_parameter)
  • delete_uri_tail_slash:删除 URI 尾部斜杠(默认 false)
  • normalize_uri_like_servlet:Servlet 风格 URI 标准化(默认 false)

nginx_config 部分

  • http.upstream.keepalive:上游连接池大小(默认 320)
  • http.upstream.keepalive_timeout:Keepalive 超时(默认 60s)
  • http.upstream.keepalive_requests:每连接最大请求数(默认 1000)

插件影响行为的关键参数

  • 限流插件:counttime_windowkey_type
  • 重试插件:retry_countretry_timeout
  • 超时插件:connect_timeoutsend_timeoutread_timeout

5. 典型使用示例与最佳实践

5.1 最小可运行示例:创建一个简单路由

步骤 1:启动 APISIX

# 安装依赖
curl https://raw.githubusercontent.com/apache/apisix/master/utils/install-dependencies.sh -sL | bash -

# 初始化配置
apisix init

# 启动 etcd (如果未运行)
etcd &

# 启动 APISIX
apisix start

步骤 2:创建上游 (Upstream)

curl -X PUT http://127.0.0.1:9180/apisix/admin/upstreams/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" \
-d '{
  "type": "roundrobin",
  "nodes": {
    "httpbin.org:80": 1
  }
}'

步骤 3:创建路由 (Route)

curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" \
-d '{
  "uri": "/get",
  "methods": ["GET"],
  "upstream_id": 1
}'

步骤 4:测试请求

curl http://127.0.0.1:9080/get

# 响应:
# {
#   "args": {},
#   "headers": {
#     "Host": "httpbin.org",
#     ...
#   },
#   "origin": "...",
#   "url": "https://httpbin.org/get"
# }

关键点

  • Admin API 默认端口 9180,需要 X-API-KEY 认证
  • 数据面监听端口 9080(HTTP)、9443(HTTPS)
  • upstream_id 引用已创建的上游,避免路由配置冗余

5.2 示例:添加插件(限流 + 认证)

curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" \
-d '{
  "uri": "/get",
  "methods": ["GET"],
  "plugins": {
    "limit-count": {
      "count": 2,
      "time_window": 60,
      "rejected_code": 429,
      "key_type": "var",
      "key": "remote_addr"
    },
    "key-auth": {
      "key": "auth-key"
    }
  },
  "upstream_id": 1
}'

插件执行顺序

  • key-auth 优先级 2500,先执行认证
  • limit-count 优先级 1002,后执行限流
  • 插件按优先级从高到低排序执行

测试限流

# 创建 Consumer
curl -X PUT http://127.0.0.1:9180/apisix/admin/consumers \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" \
-d '{
  "username": "jack",
  "plugins": {
    "key-auth": {
      "key": "auth-key"
    }
  }
}'

# 正常请求 (第1、2次)
curl http://127.0.0.1:9080/get -H "apikey: auth-key"
# 响应: 200 OK

# 超限请求 (第3次)
curl http://127.0.0.1:9080/get -H "apikey: auth-key"
# 响应: 429 Too Many Requests

5.3 最佳实践:服务抽象与复用

问题

多个路由指向同一上游和插件配置,修改时需逐个更新。

方案:使用 Service 对象

# 1. 创建 Service (包含上游和通用插件)
curl -X PUT http://127.0.0.1:9180/apisix/admin/services/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" \
-d '{
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "httpbin.org:80": 1
    }
  },
  "plugins": {
    "limit-count": {
      "count": 100,
      "time_window": 60,
      "key_type": "var",
      "key": "remote_addr"
    }
  }
}'

# 2. 创建多个路由引用同一 Service
curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" \
-d '{
  "uri": "/get",
  "service_id": 1
}'

curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/2 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" \
-d '{
  "uri": "/post",
  "methods": ["POST"],
  "service_id": 1,
  "plugins": {
    "request-validation": {
      "body_schema": {
        "type": "object",
        "required": ["name"]
      }
    }
  }
}'

优势

  • Service 定义通用配置,Route 定义个性化配置
  • Route 插件优先级高于 Service 插件
  • 修改 Service 后,所有引用的 Route 自动生效

5.4 最佳实践:灰度发布

场景

将 10% 流量导向新版本服务,90% 流量保持旧版本。

方案:使用 traffic-split 插件

curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" \
-d '{
  "uri": "/api/*",
  "plugins": {
    "traffic-split": {
      "rules": [
        {
          "weighted_upstreams": [
            {
              "upstream": {
                "name": "upstream_v1",
                "type": "roundrobin",
                "nodes": {
                  "127.0.0.1:8001": 1
                }
              },
              "weight": 9
            },
            {
              "upstream": {
                "name": "upstream_v2",
                "type": "roundrobin",
                "nodes": {
                  "127.0.0.1:8002": 1
                }
              },
              "weight": 1
            }
          ]
        }
      ]
    }
  },
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "127.0.0.1:8001": 1
    }
  }
}'

高级场景:基于请求头的灰度

{
  "rules": [
    {
      "match": [
        {
          "vars": [
            ["http_x_canary", "==", "true"]
          ]
        }
      ],
      "weighted_upstreams": [
        {
          "upstream_id": 2,
          "weight": 1
        }
      ]
    }
  ]
}

5.5 最佳实践:健康检查配置

curl -X PUT http://127.0.0.1:9180/apisix/admin/upstreams/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" \
-d '{
  "type": "roundrobin",
  "nodes": {
    "127.0.0.1:8001": 1,
    "127.0.0.1:8002": 1
  },
  "checks": {
    "active": {
      "type": "http",
      "http_path": "/health",
      "timeout": 1,
      "healthy": {
        "interval": 5,
        "successes": 2
      },
      "unhealthy": {
        "interval": 5,
        "http_failures": 3
      }
    },
    "passive": {
      "healthy": {
        "http_statuses": [200, 201, 202],
        "successes": 3
      },
      "unhealthy": {
        "http_statuses": [500, 502, 503, 504],
        "http_failures": 3,
        "tcp_failures": 3
      }
    }
  }
}'

配置说明

  • 主动健康检查:每 5 秒向 /health 发起 HTTP 请求,连续成功 2 次标记为健康,失败 3 次标记为不健康
  • 被动健康检查:根据实际请求结果判断,5xx 错误或连接失败累计 3 次标记为不健康
  • 恢复机制:不健康节点持续探测,满足健康条件后自动恢复

5.6 扩展点:自定义插件

最小插件示例

-- apisix/plugins/my-plugin.lua
local core = require("apisix.core")

local schema = {
    type = "object",
    properties = {
        body = {
            type = "string"
        }
    },
    required = {"body"}
}

local _M = {
    version = 0.1,
    priority = 10000,  -- 优先级,越大越先执行
    name = "my-plugin",
    schema = schema
}

function _M.check_schema(conf)
    return core.schema.check(schema, conf)
end

function _M.access(conf, ctx)
    core.log.warn("my-plugin access phase, body: ", conf.body)
    -- 返回非 nil 值会中断请求
    -- return 403, {message = "Forbidden"}
end

return _M

注册插件

conf/config.yaml 中添加:

plugins:
  - my-plugin  # 添加自定义插件
  - ... # 其他插件

使用插件

curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" \
-d '{
  "uri": "/test",
  "plugins": {
    "my-plugin": {
      "body": "hello custom plugin"
    }
  },
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "httpbin.org:80": 1
    }
  }
}'

5.7 生产环境注意事项

安全

  • 修改 Admin API Key:默认 key edd1c9f034335f136f87ad84b625c8f1 必须修改
  • 禁用不必要的插件:减少攻击面和内存占用
  • 启用 IP 白名单:限制 Admin API 访问来源
  • 使用 HTTPS:生产环境必须启用 SSL/TLS

性能

  • 调整 worker 数量:根据 CPU 核数设置 nginx_config.worker_processes
  • 调整连接池大小:根据并发量调整 keepalivekeepalive_requests
  • 启用 HTTP/2:提升性能,减少连接数

可靠性

  • etcd 集群部署:至少 3 节点保证高可用
  • 健康检查:为所有上游配置主动和被动健康检查
  • 监控告警:接入 Prometheus + Grafana,监控关键指标

灰度发布流程

  1. 部署新版本服务到独立上游
  2. 创建 traffic-split 规则,初始流量 0%
  3. 逐步增加新版本流量比例(1% → 5% → 10% → 50% → 100%)
  4. 观察错误率、延迟等指标
  5. 确认无问题后,切换全部流量,下线旧版本

6. 模块文档索引

本项目源码剖析包含以下详细模块文档:

  1. APISIX-01-核心模块.md:初始化模块、核心工具模块、配置系统详解
  2. APISIX-02-路由系统.md:HTTP路由、Stream路由、路由匹配算法、radixtree原理
  3. APISIX-03-插件系统.md:插件加载机制、生命周期、优先级、schema校验、核心插件解析
  4. APISIX-04-Admin管理接口.md:Routes、Services、Upstreams、Consumers、SSL等所有Admin API详解
  5. APISIX-05-上游与负载均衡.md:上游管理、负载均衡策略、健康检查、服务发现集成
  6. APISIX-06-SSL与安全.md:SSL/TLS处理、SNI匹配、mTLS、证书管理
  7. APISIX-07-流处理与xRPC.md:TCP/UDP代理、Stream插件、xRPC协议扩展
  8. APISIX-08-辅助模块.md:Secret管理、Control API、CLI工具、事件系统
  9. APISIX-09-最佳实践与案例.md:生产环境配置、性能优化、常见问题、实战案例

7. 系统级关键场景

7.1 冷启动流程

sequenceDiagram
    autonumber
    participant Nginx as Nginx Master
    participant Worker as Nginx Worker
    participant Init as init.lua
    participant Config as config 模块
    participant Plugin as plugin 模块
    participant Router as router 模块
    participant Etcd as etcd

    Nginx->>Worker: fork worker 进程
    Worker->>Init: init_by_lua_block<br/>加载 APISIX 代码
    Init->>Init: 设置 JIT 参数
    Init->>Init: require("apisix.patch").patch()

    Worker->>Init: http_init()
    Init->>Config: core.resolver.init_resolver()<br/>初始化 DNS 解析器
    Init->>Config: core.id.init()<br/>生成节点 ID
    Init->>Config: core.config.init()<br/>初始化配置中心连接
    Config->>Etcd: 连接 etcd 集群
    Etcd-->>Config: 连接成功

    Worker->>Init: init_worker_by_lua_block
    Init->>Init: http_init_worker()
    Init->>Init: 设置随机数种子
    Init->>Init: events.init_worker()<br/>初始化事件总线
    Init->>Init: lrucache.init_worker()<br/>初始化 LRU 缓存

    Init->>Config: core.config.init_worker()
    Config->>Etcd: watch /apisix/routes
    Config->>Etcd: watch /apisix/upstreams
    Config->>Etcd: watch /apisix/services
    Config->>Etcd: watch /apisix/ssls
    Config->>Etcd: watch /apisix/consumers
    Config->>Etcd: watch /apisix/global_rules
    Config->>Etcd: watch /apisix/plugin_configs

    Etcd-->>Config: 返回初始数据 + watch ID

    Init->>Plugin: plugin.init_worker()
    Plugin->>Plugin: load() 加载插件列表
    Plugin->>Plugin: 加载各插件模块<br/>require("apisix.plugins.*")
    Plugin->>Plugin: 校验插件 schema
    Plugin->>Plugin: 按优先级排序插件
    Plugin->>Plugin: 调用各插件 init() 方法

    Init->>Router: router.http_init_worker()
    Router->>Router: 加载路由实现<br/>require("apisix.http.router.radixtree_uri")
    Router->>Config: 订阅 routes 配置变更
    Router->>Router: 构建 radixtree 路由树

    Init->>Init: balancer.init_worker()
    Init->>Init: admin.init_worker()<br/>初始化 Admin API
    Init->>Init: upstream.init_worker()<br/>订阅 upstreams 变更
    Init->>Init: consumer.init_worker()<br/>订阅 consumers 变更
    Init->>Init: secret.init_worker()<br/>初始化密钥管理

    Init-->>Worker: 初始化完成
    Worker-->>Nginx: worker 就绪

    Note over Nginx,Etcd: === 配置热更新示例 ===
    Etcd->>Config: watch 触发 (routes 变更)
    Config->>Router: filter() 回调
    Router->>Router: 重建 radixtree
    Router->>Router: load_times += 1

冷启动关键点

  • init 阶段:仅加载代码,不连接外部资源,避免 master 进程阻塞
  • init_worker 阶段:每个 worker 独立连接 etcd,订阅配置变更
  • 插件加载:按 conf/config.yaml 中的 plugins 列表顺序加载,校验 schema 后按优先级排序
  • 路由树构建:首次构建 radixtree 时间复杂度 O(n),n 为路由数量
  • watch 机制:etcd watch 长连接,配置变更时触发回调,重建路由树或插件列表

7.2 配置热更新流程

sequenceDiagram
    autonumber
    participant User as 管理员
    participant Admin as Admin API
    participant Etcd as etcd
    participant Watch as config 模块<br/>(watch 协程)
    participant Worker as Worker 进程
    participant Router as router 模块

    User->>Admin: PUT /apisix/admin/routes/1
    Admin->>Admin: 校验 JSON schema
    Admin->>Admin: 校验插件配置
    Admin->>Etcd: PUT /apisix/routes/1
    Etcd-->>Admin: 成功 ( modifiedIndex)
    Admin-->>User: 200 OK

    Etcd->>Watch: watch event (PUT)
    Watch->>Watch: 解析变更数据
    Watch->>Router: filter(route) 回调
    Router->>Router: 更新 route 对象<br/>orig_modifiedIndex = modifiedIndex
    Router->>Router: set_plugins_meta_parent()
    Router->>Router: filter_upstream()
    Router->>Router: 重建 radixtree
    Router->>Router: load_times += 1

    Watch-->>Worker: 配置已更新

    Note over User,Router: === 下一个请求立即生效 ===
    User->>Worker: GET /api/users
    Worker->>Router: router_http.match(api_ctx)
    Router->>Router: radixtree.dispatch()<br/>使用新路由树
    Router-->>Worker: matched_route (新配置)

热更新特性

  • 秒级生效:etcd watch 延迟通常 < 100ms
  • 原子更新:单个配置对象更新是原子的
  • 版本控制:通过 modifiedIndex 追踪配置版本
  • LRU 失效:配置变更后,相关 LRU 缓存自动失效(通过版本号)
  • 无中断:热更新不影响正在处理的请求

7.3 异常恢复场景

etcd 不可用

stateDiagram-v2
    [*] --> 正常运行: etcd 可用
    正常运行 --> etcd断连: 网络中断/etcd挂掉
    etcd断连 --> 降级运行: watch 失败
    降级运行 --> 降级运行: 使用本地缓存配置<br/>无法变更配置
    etcd断连 --> 正常运行: etcd 恢复<br/>重建 watch
    降级运行 --> 正常运行: etcd 恢复<br/>同步最新配置

降级策略

  • 已加载配置继续生效:APISIX 缓存所有配置在内存,etcd 不可用时继续处理请求
  • 无法变更配置:Admin API 返回 503,无法创建或修改配置
  • 自动重连:config 模块定时重连 etcd(默认 30 秒)
  • 日志告警:记录 etcd 连接失败日志,便于监控告警

上游节点全部不健康

stateDiagram-v2
    [*] --> 正常: 有健康节点
    正常 --> 全部不健康: 主动/被动健康检查<br/>标记所有节点不健康
    全部不健康 --> 使用所有节点: 忽略健康状态
    使用所有节点 --> 正常: 节点恢复健康

兜底策略

  • fetch_health_nodes():当所有节点不健康时,返回全部节点
  • 日志警告all upstream nodes is unhealthy, use default
  • 持续探测:健康检查持续进行,节点恢复后自动加入

8. 性能基准与容量规划

8.1 性能指标(单实例)

场景 CPU 核数 QPS P99 延迟 内存占用
静态路由 (无插件) 1 23,000 2ms 50MB
静态路由 (5 个插件) 1 18,000 3ms 80MB
动态上游 (服务发现) 1 15,000 5ms 100MB
gRPC 代理 1 20,000 2.5ms 60MB
WebSocket 长连接 4 100,000 连接 - 2GB

测试环境

  • CPU: Intel Xeon 3.0GHz
  • 内存: 16GB
  • OpenResty: 1.21.4.1
  • etcd: 3.5

8.2 水平扩展建议

  • 小型部署:1-2 个实例 + 单节点 etcd,适合 < 10,000 QPS
  • 中型部署:3-5 个实例 + 3 节点 etcd 集群,适合 10,000 - 100,000 QPS
  • 大型部署:10+ 个实例 + 5 节点 etcd 集群,适合 > 100,000 QPS

8.3 容量规划因子

  • 路由数量:< 1000 条路由时性能影响可忽略,> 10,000 条路由建议拆分实例
  • 插件复杂度:CPU 密集型插件(如加密、压缩)显著影响 QPS
  • 上游节点数:单个 upstream > 1000 节点时,健康检查开销显著
  • TLS 握手:HTTPS 握手 CPU 开销约为 HTTP 的 3-5 倍

9. 附录

9.1 OpenResty 执行阶段

阶段 Lua 指令 APISIX 回调函数 说明
init init_by_lua_block 加载 Lua 代码,master 进程执行
init_worker init_worker_by_lua_block http_init_worker() worker 进程初始化
ssl_cert ssl_certificate_by_lua_block ssl_phase() SSL 证书加载
ssl_client_hello ssl_client_hello_by_lua_block ssl_client_hello_phase() SSL 握手开始,SNI 匹配
rewrite rewrite_by_lua_block 无 (插件 rewrite 在 access 阶段) URL 重写
access access_by_lua_block http_access_phase() 访问控制,插件主要执行阶段
balancer balancer_by_lua_block http_balancer_phase() 负载均衡,选择上游节点
header_filter header_filter_by_lua_block http_header_filter_phase() 响应头过滤
body_filter body_filter_by_lua_block http_body_filter_phase() 响应体过滤
log log_by_lua_block http_log_phase() 日志记录

9.2 关键数据结构

api_ctx (请求上下文)

{
    var = {},                      -- Nginx 变量封装
    matched_route = route,         -- 匹配的路由对象
    matched_upstream = upstream,   -- 匹配的上游对象
    matched_ssl = ssl,             -- 匹配的 SSL 对象
    plugins = {plugin_obj, conf, ...},  -- 激活的插件列表 (对象和配置交替)
    conf_type = "route",           -- 配置类型
    conf_version = "123",          -- 配置版本号
    conf_id = "1",                 -- 配置 ID
    upstream_conf = up_conf,       -- 上游配置
    upstream_version = "123",      -- 上游版本号
    upstream_key = "upstreams#1",  -- 上游缓存 key
    upstream_scheme = "http",      -- 上游协议
    balancer_ip = "127.0.0.1",     -- 选中的节点 IP
    balancer_port = 8080,          -- 选中的节点端口
    balancer_try_count = 1,        -- 负载均衡尝试次数
    picked_server = server,        -- 选中的服务器对象
    server_picker = picker,        -- 负载均衡选择器
    up_checker = checker,          -- 健康检查器
    consumer = consumer,           -- 认证通过的消费者
    consumer_name = "jack",        -- 消费者名称
    consumer_ver = "123"           -- 消费者版本号
}

route (路由对象)

{
    value = {
        id = "1",                  -- 路由 ID
        uri = "/api/*",            -- URI 匹配模式
        uris = {"/api/v1", "/api/v2"},  -- 多个 URI (二选一)
        methods = {"GET", "POST"}, -- HTTP 方法
        host = "api.example.com",  -- 域名
        hosts = {"api.example.com", "*.example.com"},  -- 多个域名
        remote_addr = "192.168.1.0/24",  -- 客户端 IP
        remote_addrs = {"192.168.1.0/24"},  -- 多个 IP
        vars = {{"arg_id", "==", "123"}},  -- Nginx 变量表达式
        filter_func = "function(vars) ... end",  -- 自定义过滤函数
        priority = 0,              -- 优先级 (默认 0)
        plugins = {                -- 插件配置
            ["limit-count"] = {
                count = 100,
                time_window = 60
            }
        },
        upstream_id = "1",         -- 上游 ID
        upstream = {...},          -- 内联上游配置
        service_id = "1",          -- 服务 ID
        plugin_config_id = "1",    -- 插件配置 ID
        script = "...",            -- 脚本路由
        enable_websocket = true,   -- 启用 WebSocket
        timeout = {                -- 超时配置
            connect = 60,
            send = 60,
            read = 60
        },
        status = 1                 -- 启用状态 (0 禁用, 1 启用)
    },
    modifiedIndex = 123,           -- etcd 修改版本号
    key = "/apisix/routes/1"       -- etcd key
}

upstream (上游对象)

{
    resource_id = "1",             -- 上游 ID
    resource_version = "123",      -- 配置版本号
    resource_key = "/apisix/upstreams/1",  -- etcd key
    type = "roundrobin",           -- 负载均衡类型
    nodes = {                      -- 节点列表
        {host = "127.0.0.1", port = 8080, weight = 1, priority = 0},
        {host = "127.0.0.1", port = 8081, weight = 2, priority = 0}
    },
    scheme = "http",               -- 协议 (http/https/grpc/grpcs)
    hash_on = "vars",              -- 哈希键类型 (chash)
    key = "remote_addr",           -- 哈希键
    retries = 2,                   -- 重试次数
    retry_timeout = 0,             -- 重试超时 (0 表示无限)
    timeout = {                    -- 超时配置
        connect = 60,
        send = 60,
        read = 60
    },
    keepalive_pool = {             -- 连接池配置
        size = 320,
        idle_timeout = 60,
        requests = 1000
    },
    pass_host = "pass",            -- Host 传递策略 (pass/rewrite/node)
    upstream_host = "api.example.com",  -- 自定义 Host
    service_name = "my-service",   -- 服务发现服务名
    discovery_type = "consul",     -- 服务发现类型
    discovery_args = {...},        -- 服务发现参数
    checks = {                     -- 健康检查配置
        active = {...},            -- 主动健康检查
        passive = {...}            -- 被动健康检查
    },
    tls = {                        -- 上游 TLS 配置
        client_cert = "...",       -- 客户端证书
        client_key = "...",        -- 客户端私钥
        client_cert_id = "1"       -- 客户端证书 ID
    }
}

9.3 关键配置项速查

config.yaml 核心配置

apisix:
  node_listen:                     # 监听端口
    - 9080                         # HTTP
    - port: 9443                   # HTTPS
      ssl: true
  enable_admin: true               # 启用 Admin API
  enable_control: true             # 启用 Control API
  enable_debug: false              # 启用调试模式
  enable_dev_mode: false           # 启用开发模式 (自动重载代码)
  enable_reuseport: true           # 启用端口复用
  enable_ipv6: true                # 启用 IPv6

  router:
    http: radixtree_uri            # HTTP 路由实现
    ssl: radixtree_sni             # SSL 路由实现

  proxy_cache:                     # 代理缓存配置
    zones:
    - name: disk_cache_one
      memory_size: 50m
      disk_size: 1G
      disk_path: /tmp/disk_cache_one

  delete_uri_tail_slash: false     # 删除 URI 尾部斜杠
  normalize_uri_like_servlet: false  # Servlet 风格 URI 标准化

nginx_config:
  error_log_level: warn            # 错误日志级别
  worker_processes: auto           # worker 进程数 (auto = CPU 核数)
  worker_rlimit_nofile: 20480      # 文件描述符上限

  event:
    worker_connections: 10620      # 每个 worker 最大连接数

  http:
    access_log: logs/access.log    # 访问日志路径
    keepalive_timeout: 60s         # Keepalive 超时
    client_header_timeout: 60s     # 客户端 header 超时
    client_body_timeout: 60s       # 客户端 body 超时
    send_timeout: 10s              # 发送超时

    upstream:
      keepalive: 320               # 上游连接池大小
      keepalive_timeout: 60s       # 上游 Keepalive 超时
      keepalive_requests: 1000     # 每连接最大请求数

deployment:
  role: traditional                # 角色 (traditional/data_plane/control_plane)
  role_traditional:
    config_provider: etcd          # 配置提供者 (etcd/yaml/xds)

  admin:
    admin_key:                     # Admin API 密钥
      - name: admin
        key: edd1c9f034335f136f87ad84b625c8f1
        role: admin
    admin_listen:
      ip: 0.0.0.0
      port: 9180
    https_admin: false             # Admin API 使用 HTTPS
    enable_admin_cors: true        # Admin API CORS

  etcd:
    host:                          # etcd 集群地址
      - "http://127.0.0.1:2379"
    prefix: /apisix                # etcd key 前缀
    timeout: 30                    # 连接超时 (秒)

plugin_attr:                       # 插件全局属性
  prometheus:
    export_addr:
      ip: 0.0.0.0
      port: 9091
  skywalking:
    service_name: APISIX
    service_instance_name: APISIX-Instance-1
    endpoint_addr: http://127.0.0.1:12800

plugins:                           # 启用的插件列表
  - real-ip
  - client-control
  - proxy-control
  - request-id
  - zipkin
  - ext-plugin-pre-req
  - fault-injection
  - mocking
  - serverless-pre-function
  - cors
  - ip-restriction
  - ua-restriction
  - referer-restriction
  - csrf
  - uri-blocker
  - request-validation
  - openid-connect
  - authz-keycloak
  - authz-casdoor
  - wolf-rbac
  - ldap-auth
  - hmac-auth
  - basic-auth
  - jwt-auth
  - key-auth
  - consumer-restriction
  - forward-auth
  - opa
  - proxy-rewrite
  - workflow
  - proxy-mirror
  - api-breaker
  - limit-req
  - limit-count
  - limit-conn
  # ... 更多插件

本文档持续更新

  • 文档版本:v1.0
  • APISIX 版本:3.x
  • 最后更新:2025-01
  • 维护者:APISIX 源码剖析项目组

如发现文档错误或有改进建议,请提交 Issue 或 Pull Request。