版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sky6even/article/details/90634412
OpenResty基于Nginx,把Web服务的整个生命周期和请求处理流程清晰地划分出了若干个阶段(Phase)
◆ 处理阶段:
一个Web 服务的生命周期可以分成三个阶段
initing:服务启动,该阶段通常是读取配置文件,初始化内部数据结构
running:服务运行,接受客户端的请求,返回响应结果
exiting:服务停止,做一些必要的清理工作,如关闭监听端口
OpenResty 目前关注的是initing 和running 这两个阶段,并做了更细致的划分。
1、initing 阶段:
initing 阶段在OpenResty 里分为三个子阶段:
configuration:读取配置文件,解析配置指令,设置运行参数
master-initing:配置文件解析完毕,master进程初始化公用的数据
worker-initing:worker 进程自己的初始化,进程专用的数据
2、running 阶段:
在running 阶段,收到客户端请求后,OpenResty对每个请求都会使用一个专门的“流水线”顺序进行处理,“流水线”上就是OpenResty 定义的处理阶段。
ssl:SSL/TLS 安全通信和验证
preread:在正式处理之前“预读”数据,接收 HTTP 请求头:
rewrite:检查、改写URI,实现跳转/重定向
access:访问权限控制
content:产生响应内容
filter:对content阶段产生的内容进行过滤加工处理
log:请求处理完毕,记录日志,或者其他的收尾工作
◆ 执行程序:
OpenResty 提供了一些“ xxx_by_lua ”指令,开发Web应用时使用它们就可以在这些阶段里插入Lua代码,执行业务逻辑
□ init_by_lua:master-initing阶段,初始化全局配置或模块
□ init_worker_by_lua:worker-initing阶段,初始化进程专用功能
□ ssl_certificate_by_lua:ssl阶段,在“握手”时设置安全证书
□ set_by_lua:rewrite阶段,改写Nginx变量
□ rewrite_by_lua:rewrite阶段,改写URI,实现跳转/重定向
□ access_by_lua:access阶段,访问控制或限速
□ content_by_lua:content阶段,产生响应内容
□ balancer_by_lua:content阶段,反向代理时选择后端服务器
□ header_filter_by_lua:filter阶段,加工处理响应头
□ body_filter_by_lua:filter阶段,加工处理响应体
□ log_by_lua:log阶段,记录日志或其他的收尾工作
注意:在HTTP 处理过程中没有“ preread_by_lua ”,即Preread 阶段只能由OpenResty 内部读取HTTP 请求头,用户不能介入干预(但TCP/UDP 协议是允许的)。
使用示例:
init_worker_by_lua_block { -- worker-initing 阶段
... -- 启动定时器,定时从Redis里获取数据
}
rewrite_by_lua_block{ -- rewrite阶段,通常是检查、改写URI
... -- 但也可以操作响应体,做编码解码工作
}
access_by_lua_block{ -- access阶段,通常做权限控制
... -- 检查权限,例如ip地址、访问次数
}
content_by_lua_block{ -- content阶段, Lua产生响应内容
... -- 主要的业务逻辑,产生向客户端输出的内容
}
body_filter_by_lua_block{ -- filter 阶段,加工处理响应数据
... -- 可以对数据编码、加密或者附加额外数据
}
log_by_lua_block{ -- log阶段,请求结束后的收尾工作
... -- 可以向某个后端发送处理完毕的“回执”
}
这些指令通常都有三种形式(少数例外) :
xxx_by_lua:执行字符串形式的Lua代码
xxx_by_lua_block:功能相同,但指令后是{...}的Lua代码块
xxx_by_lua_file:功能相同,但执行磁盘上的源码文件。
推荐使用“xxx_by_lua_file ”方式,它彻底分离了配置文件与业务代码,让两者可以独立部署,而且文件形式也让我们更容易以模块的方式管理组织Lua 程序。
location ~ ^/(\w+) {
content_by_lua_file service/http/$1.lua
}
◆ 指令执行顺序和阶段: