
一、Worker 启动阶段非请求级阶段作用init_by_luaMaster 进程启动时执行一次用于加载模块、初始化全局配置init_worker_by_lua每个 Worker 进程启动时执行一次用于定时器、连接池预热等exit_worker_by_luaWorker 退出前执行用于清理资源二、HTTP 请求处理阶段按顺序客户端请求 │ ▼ ┌─────────────────┐ │ 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 │ 记录访问日志 └─────────────────┘三、各阶段详细说明1. POST_READ时机读完 HTTP 请求头之后典型用途根据请求头做早期判断、限流前置逻辑特点此时请求体通常还未读2. SERVER_REWRITE时机Server 块级别的 rewrite典型用途Server 级 URL 重写比 location rewrite 更早3. REWRITE时机Location 匹配后执行rewrite规则典型用途URL 重写、路径跳转修改uri、argsAPISIX 中很多插件在此阶段运行如你的authz-keycloak的rewrite做 introspectLua 钩子rewrite_by_lua*4. PREACCESS时机Access 之前典型用途limit_req、limit_conn等限流/限连5. ACCESS时机真正访问上游之前典型用途鉴权、IP 黑白名单决定是否允许继续处理可return 403/401终止请求Lua 钩子access_by_lua*APISIX多数认证/授权插件的access在此执行6. CONTENT时机生成或转发响应内容典型用途proxy_pass转发到上游返回静态文件自定义响应体Lua 钩子content_by_lua*特点这是“干活”阶段请求会真正发到后端7. HEADER_FILTER时机收到上游响应头、发给客户端之前典型用途增删改响应头CORS、缓存头、安全头等注意可能被多次调用如 subrequest8. BODY_FILTER时机响应体发给客户端之前典型用途响应体改写、压缩、加密注意分块流式处理可能被多次调用9. LOG时机请求完全结束后典型用途访问日志、指标统计、审计特点此时不能再修改响应也不能return影响客户端四、OpenResty 特有的 Lua 阶段Lua 指令对应 Nginx 阶段说明set_by_lua*REWRITE变量求值时为 Nginx 变量赋值禁止 I/Orewrite_by_lua*REWRITE可 rewrite、可读 body需显式 readaccess_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 插件的对应关系APISIX 插件可注册不同 phase 的钩子常见映射APISIX 插件方法大致对应阶段典型场景rewriteREWRITEURL 重写、早期 token 校验accessACCESS鉴权、限流、权限校验header_filterHEADER_FILTER改响应头body_filterBODY_FILTER改响应体logLOG日志上报执行顺序同一插件内rewrite→access→ … →log多个插件按priority 数值越大越先执行。六、几个实用原则越早终止越好鉴权失败尽量在access或更早返回避免无效 upstream 调用。REWRITE vs ACCESSREWRITE改 URI、早期预处理ACCESS做“能不能访问”的判断HEADER/BODY_FILTER 不能阻断请求只能改响应不能return错误码给客户端错误应在更早阶段处理。LOG 阶段只做记录不影响业务响应。set_by_lua禁止 I/O不能发 HTTP、不能查 Redis只适合纯计算。