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()查找匹配sni或snis字段的 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_id、http_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_ctx、plugins、match_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_name和discovery_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_ctx、plugins、match_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)
插件影响行为的关键参数
- 限流插件:
count、time_window、key_type - 重试插件:
retry_count、retry_timeout - 超时插件:
connect_timeout、send_timeout、read_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 - 调整连接池大小:根据并发量调整
keepalive、keepalive_requests - 启用 HTTP/2:提升性能,减少连接数
可靠性
- etcd 集群部署:至少 3 节点保证高可用
- 健康检查:为所有上游配置主动和被动健康检查
- 监控告警:接入 Prometheus + Grafana,监控关键指标
灰度发布流程
- 部署新版本服务到独立上游
- 创建 traffic-split 规则,初始流量 0%
- 逐步增加新版本流量比例(1% → 5% → 10% → 50% → 100%)
- 观察错误率、延迟等指标
- 确认无问题后,切换全部流量,下线旧版本
6. 模块文档索引
本项目源码剖析包含以下详细模块文档:
- APISIX-01-核心模块.md:初始化模块、核心工具模块、配置系统详解
- APISIX-02-路由系统.md:HTTP路由、Stream路由、路由匹配算法、radixtree原理
- APISIX-03-插件系统.md:插件加载机制、生命周期、优先级、schema校验、核心插件解析
- APISIX-04-Admin管理接口.md:Routes、Services、Upstreams、Consumers、SSL等所有Admin API详解
- APISIX-05-上游与负载均衡.md:上游管理、负载均衡策略、健康检查、服务发现集成
- APISIX-06-SSL与安全.md:SSL/TLS处理、SNI匹配、mTLS、证书管理
- APISIX-07-流处理与xRPC.md:TCP/UDP代理、Stream插件、xRPC协议扩展
- APISIX-08-辅助模块.md:Secret管理、Control API、CLI工具、事件系统
- 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。