Openresty资料之运行机制,


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
}

◆ 指令执行顺序和阶段:

相关内容

    暂无相关文章