全书目录

第五十四篇:OpenResty 完全指南 —— 可编程网关锻造厂宇宙

三、请求生命周期:请求在工厂里怎么流动

2 分钟 503 字 第 938 / 962 个阅读单元

先看一张简化图:

text
Client
  |
  v
[accept/read]
  |
  v
[server rewrite]
  |
  v
[find location]
  |
  v
[location rewrite] -- URI changed? --> [find location again]
  |
  v
[access]
  |
  v
[content / proxy_pass / upstream]
  |
  v
[header filter]
  |
  v
[body filter]
  |
  v
[log]
  |
  v
Response

在 OpenResty 里,你最常接触的是这些挂钩点:

text
init_by_lua*            启动装配:主进程加载配置/模块
init_worker_by_lua*     工人上岗:每个 worker 初始化
rewrite_by_lua*         改写 URI、变量、路由前置处理
access_by_lua*          鉴权、限流、ACL、风控
balancer_by_lua*        动态选上游
content_by_lua*         直接生成响应
header_filter_by_lua*   改响应头
body_filter_by_lua*     改响应体流
log_by_lua*             请求收尾日志
ssl_certificate_by_lua* 动态证书/TLS 阶段逻辑

#1. rewrite 阶段:决定请求去哪

这是“粗加工工位”。常干这些事:

  • 改 URI
  • 解析路径参数
  • 设置 Nginx 变量
  • 提前决定某些路由分支

适合做“路径整形”,不适合塞太重的业务判断。

#2. access 阶段:决定能不能过

这是最像“闸机”的工位。常见职责:

  • 鉴权
  • 限流
  • 黑白名单
  • 配额
  • 机器人拦截
  • 租户隔离

很多 API 网关价值,基本都集中在这里。

#3. balancer 阶段:决定送到哪台上游

这是“分拣机械臂”:

  • 灰度发布
  • 金丝雀路由
  • 按租户选集群
  • 按权重、健康状态、标签选节点

如果你想做“真正动态”的上游决策,这里很关键。

#4. header_filter / body_filter:回程加工

请求打完上游回来,还能继续加工:

  • 加/改响应头
  • 统一错误格式
  • 注入追踪 ID
  • 裁剪或转换响应体

但这里有个重要认知:filter 阶段是在“响应流动中”工作,不是拿到完整结果后再慢慢处理。

#5. log:收尾,不是主战场

适合做:

  • 打点
  • 异步上报
  • 埋点
  • 请求画像汇总

不适合在这里做影响主路径正确性的关键业务。