对应于一个Web应用程序的生命周期,OpenResty中提供了11个流程配置阶段,我们的Lua代码就是围绕这11个阶段展开编写的,这篇笔记我们对这些概念进行介绍。
对于一个Web服务端应用程序,它的生命周期大致可以分为三部分:
针对初始化阶段和运行阶段,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 | server 、location |
Nginx处理URL重写阶段,可用于设置Nginx变量 |
rewrite_by_lua | server 、location |
Nginx处理URL重写阶段,可用于改写URL |
access_by_lua | server 、location |
产生响应之前的接入阶段,可实现访问控制、接口限流等 |
content_by_lua | server 、location |
请求处理阶段,大部分业务逻辑在此实现 |
balancer_by_lua | upstream |
请求处理阶段,用于反向代理时选择后端服务器 |
header_filter_by_lua | server 、location |
响应后处理阶段,加工处理响应头 |
body_filter_by_lua | server 、location |
响应后处理阶段,加工处理响应体 |
log_by_lua | server 、location |
Log阶段,主要用于记录日志等 |
这11个流程阶段的流程关系如下图所示。
合理组合使用这11个流程阶段,我们就可以把复杂的业务逻辑拆分成若干简单的模块,实现高内聚、低耦合的Web应用程序。
流程阶段的配置指令通常有三种形式:
{ ... }
块内的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!')