




























OpenResty 基于 Nginx 的请求处理模型,在标准 Nginx 阶段上增加了 Lua 钩子。下面按实际执行顺序说明各阶段及其作用。
| 阶段 | 作用 |
|---|---|
| init_by_lua | Master 进程启动时执行一次,用于加载模块、初始化全局配置 |
| init_worker_by_lua | 每个 Worker 进程启动时执行一次,用于定时器、连接池预热等 |
| exit_worker_by_lua | Worker 退出前执行,用于清理资源 |
客户端请求
│
▼
┌─────────────────┐
│ 1. POST_READ │ 读完请求头后
└────────┬────────┘
▼
┌─────────────────┐
│ 2. SERVER_REWRITE│ Server 级 rewrite(较少用)
└────────┬────────┘
▼
┌─────────────────┐
│ 3. FIND_CONFIG │ 匹配 server/location(内部阶段,一般无 Lua)
└────────┬────────┘
▼
┌─────────────────┐
│ 4. REWRITE │ URL 重写、路由跳转
└────────┬────────┘
▼
┌─────────────────┐
│ 5. PREACCESS │ 限流、限连(limit_req/limit_conn 等)
└────────┬────────┘
▼
┌─────────────────┐
│ 6. ACCESS │ 访问控制、鉴权、ACL
└────────┬────────┘
▼
┌─────────────────┐
│ 7. CONTENT │ 生成/转发响应(proxy_pass、静态文件等)
└────────┬────────┘
▼
上游响应返回
│
▼
┌─────────────────┐
│ 8. HEADER_FILTER│ 修改响应头(可多次执行)
└────────┬────────┘
▼
┌─────────────────┐
│ 9. BODY_FILTER │ 修改响应体(分块,可多次执行)
└────────┬────────┘
▼
┌─────────────────┐
│ 10. LOG │ 记录访问日志
└─────────────────┘
rewrite 规则uri、argsauthz-keycloak 的 rewrite 做 introspect)rewrite_by_lua*limit_req、limit_conn 等限流/限连return 403/401 终止请求access_by_lua*access 在此执行proxy_pass 转发到上游content_by_lua*return 影响客户端| Lua 指令 | 对应 Nginx 阶段 | 说明 |
|---|---|---|
set_by_lua* |
REWRITE(变量求值时) | 为 Nginx 变量赋值,禁止 I/O |
rewrite_by_lua* |
REWRITE | 可 rewrite、可读 body(需显式 read) |
access_by_lua* |
ACCESS | 鉴权、访问控制 |
content_by_lua* |
CONTENT | 完全由 Lua 生成响应 |
header_filter_by_lua* |
HEADER_FILTER | 改响应头 |
body_filter_by_lua* |
BODY_FILTER | 改响应体 |
log_by_lua* |
LOG | 日志/统计 |
balancer_by_lua* |
选 upstream 时 | 动态负载均衡 |
ssl_certificate_by_lua* |
SSL 握手 | 动态证书 |
APISIX 插件可注册不同 phase 的钩子,常见映射:
| APISIX 插件方法 | 大致对应阶段 | 典型场景 |
|---|---|---|
rewrite |
REWRITE | URL 重写、早期 token 校验 |
access |
ACCESS | 鉴权、限流、权限校验 |
header_filter |
HEADER_FILTER | 改响应头 |
body_filter |
BODY_FILTER | 改响应体 |
log |
LOG | 日志上报 |
执行顺序:同一插件内 rewrite → access → … → log;多个插件按 priority 数值越大越先执行。
access 或更早返回,避免无效 upstream 调用。return 错误码给客户端(错误应在更早阶段处理)。set_by_lua 禁止 I/O:不能发 HTTP、不能查 Redis,只适合纯计算。此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。