执行流程配置指令

对应于一个Web应用程序的生命周期,OpenResty中提供了11个流程配置阶段,我们的Lua代码就是围绕这11个阶段展开编写的,这篇笔记我们对这些概念进行介绍。

11个流程阶段

对于一个Web服务端应用程序,它的生命周期大致可以分为三部分:

  1. 初始化:读取配置文件,初始化程序所需的数据,绑定Socket套接字并开始监听
  2. 运行:服务端程序接受用户请求,返回响应信息
  3. 关闭:执行必要的清理工作,释放占用的资源

针对初始化阶段和运行阶段,OpenResty提供了11个执行流程阶段配置,我们在这11个阶段中可以注入Lua代码,实现我们的业务逻辑功能。

流程阶段 Nginx配置块 说明
init_by_lua http master进程初始化阶段,用于初始化全局配置或模块
init_worker_by_lua http worker进程初始化阶段,可用于初始化worker进程专用功能
ssl_certificate_by_lua server SSL握手阶段,可用于设置安全证书
set_by_lua serverlocation Nginx处理URL重写阶段,可用于设置Nginx变量
rewrite_by_lua serverlocation Nginx处理URL重写阶段,可用于改写URL
access_by_lua serverlocation 产生响应之前的接入阶段,可实现访问控制、接口限流等
content_by_lua serverlocation 请求处理阶段,大部分业务逻辑在此实现
balancer_by_lua upstream 请求处理阶段,用于反向代理时选择后端服务器
header_filter_by_lua serverlocation 响应后处理阶段,加工处理响应头
body_filter_by_lua serverlocation 响应后处理阶段,加工处理响应体
log_by_lua serverlocation Log阶段,主要用于记录日志等

这11个流程阶段的流程关系如下图所示。

合理组合使用这11个流程阶段,我们就可以把复杂的业务逻辑拆分成若干简单的模块,实现高内聚、低耦合的Web应用程序。

在流程阶段中注入Lua代码

流程阶段的配置指令通常有三种形式:

  • xxx_by_lua:执行字符串形式的Lua代码,字符串长度有限制,不推荐使用
  • xxx_by_lua_block:功能同上,但执行的是{ ... }块内的Lua代码
  • xxx_by_lua_file:执行Lua文件

三种配置方式中,第一种是OpenResty早期提供的,有很多限制,不推荐使用。实际开发中,对于非常简单的代码,我们可以将其内嵌在Nginx配置文件中,但这样做的缺点是耦合度较高,对于更复杂的代码,我们一般采用指定Lua文件的方式。

Nginx配置文件内嵌Lua代码写法如下。

content_by_lua_block {
    ngx.print("Hello, world!")
}

分离的Nginx配置指令和Lua源代码文件写法如下。

content_by_lua_file 'service/hello.lua';
ngx.print('Hello, world!')
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。
Copyright © 2017-2024 Gacfox All Rights Reserved.
Build with NextJS | Sitemap