Openresty 请求处理

Openresty 请求处理,第1张

Openresty 请求处理

摘要:OpenResty 是国人开发的一个基于 Nginx 的可伸缩的 Web 平台,可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,解决了高并发的痛点。Nginx是使用异步事件模型,而 lua 可以用传统的同步编程思想上在 nginx 请求接进来后处理稍复杂的逻辑。

目录
  • OpenResty 基础
      • OpenResty 原理
      • OpenResty 执行阶段
      • OpenResty 执行阶段总结
  • OpenResty 执行阶段详解
      • 1、init_by_lua_*
      • 2、init_worker_by_lua_*
      • 3、set_by_lua_*
      • 4、rewrite_by_lua_* 、access_by_lua_* 和 content_by_lua_*
      • 5、balancer_by_lua_*
      • 6、header_filter_by_lua_* 和 body_filter_by_lua_*
      • 7、log_by_lua_*

OpenResty 基础 OpenResty 原理

Nginx 采用的是 master-worker 模型,一个 master 进程管理多个 worker 进程,基本的事件处理都是放在 woker 中,master 负责一些全局初始化,以及对 worker 的管理。
在OpenResty中,每个 woker 使用一个 LuaVM,当请求被分配到 woker 时,将在这个 LuaVM 里创建一个 coroutine(协程),协程之间数据隔离。

OpenResty 执行阶段

OpenResty将应用分为4个大阶段,11个小阶段,如下图所示。

初始化阶段: master进程启动预加载/生成worker进程预加载
转发/访问阶段:url转发,权限判断
内容处理/生成阶段: 内容生成
日志阶段: 日志记录

OpenResty 执行阶段总结
  • 注:以下所有指令均在 nginx.conf 文件里编写
阶段概述init_by_lua_*Nginx 加载配置文件时执行init_worker_by_lua_*每个 worker 进程被创建时执行set_by_lua_*初始化Nginx变量rewrite_by_lua*转发、URL重定向、缓存、子请求、控制头等功能access_by_lua*IP 准入、接口权限等情况集中处理(例如完成简单防火墙)content_by_lua*内容生成,执行业务逻辑并产生相应header_filter_by_lua*响应头部过滤处理(例如添加头部信息)body_filter_by_lua*响应体过滤处理(例如完成应答内容统一成大写)log_by_lua*会话完成后本地异步完成日志记录(日志可以记录在本地,还可以同步到其他机器) OpenResty 执行阶段详解 1、init_by_lua_*

使用方法:

init_by_lua_block {lua-script-str } 或
init_by_lua_file LuaSrc/init/init.lua; # 和init_by_lua_block作用一样,只是在将代码直接放到 init.lua 文件里

执行阶段:loading-config
当 Nginx 的 master 进程加载 Nginx 配置文件会执行指定的代码,每当 Nginx 获得 Hangup 重载信号加载进程时代码都会被重新执行。该阶段一般会初始化lua全局变量、预加载模块、初始化 lua_shared_dict 共享内存数据

可以使用的 lua API 指令:ngx.log、ngx.shared.DICT、print

2、init_worker_by_lua_*

使用方法:

init_worker_by_lua_block {lua-script-str } 或
init_worker_by_lua_file filepath

执行阶段:starting-worker
当 master 进程被启动后,每个 worker 进程被创建时都会执行这段 lua 代码,该阶段最常见的功能是执行定时任务,也可以实现后端健康检查功能,用于检测后端HTTP服务器是否正常。

3、set_by_lua_*

使用方法:

set_by_lua_block $res { lua-script-str } 或
set_by_lua_file $res filepath

执行阶段:rewrite
这里主要用于设置一些nginx变量。rewrite 阶段是 location 请求地址重写阶段,位于location中的 ngx_rewrite 指令就是在这个阶段运行,set_by_lua_* 指令块在 Nginx 中是阻塞 *** 作,不支持非阻塞I/O,尽量在这个阶段执行短少代码。

禁用的 lua API :

输出类型的API函数(如ngx.say和ngx.send_headers)。
控制类型的API函数(如ngx.exit)。
子请求的API函数(如ngx.location.capture和ngx.location.capture_multi)。
Cosocket API函数(如ngx.socket.tcp和ngx.req.socket)。
休眠API函数ngx.sleep。

4、rewrite_by_lua_* 、access_by_lua_* 和 content_by_lua_*

使用方法:

rewrite_by_lua_block { lua-script-str } 或
rewrite_by_lua_file filepath

access_by_lua_block { lua-script-str } 或
access_by_lua_file filepath

content_by_lua_block { lua-script-str } 或
content_by_lua_file filepath

执行阶段分别是:rewrite tail、access tail、content
以上指令分别在 rewrite tail / access tail / content 阶段对每个请求都会执行设置的 lua 代码,这些 lua 代码可以调用所有的 lua API ,并运行在独立的 lua 虚拟机上,以新的协程来执行。

rewrite_by_lua_* :可以实现对请求 URL 进行重定向、读取 MySQL 或 Redis 数据、发送子请求、控制请求头等。
access_by_lua_* :处理一些请求,一般用来进行权限检查和黑白名单配置,完成简单的防火墙。
content_by_lua_* :执行业务逻辑并产生相应,指令不可以和其他内容处理阶段的模块如echo、return、proxy_pass等放在一起。

5、balancer_by_lua_*

使用方法:

balancer_by_lua_block { lua-script-str } 或
balancer_by_lua_file filepath

执行阶段:content
在upstream的配置中执行并控制后端服务器的地址,它会忽视原upstream中默认的配置。Lua代码的执行环境不支持yield,因此需禁用可能会产生yield的Lua API指令。但可以利用ngx.ctx创建一个拥有上下文的变量,在本阶段前面的某个执行阶段(如rewrite_by_lua*阶段)将数据生成后传入upstream中。

6、header_filter_by_lua_* 和 body_filter_by_lua_*

使用方法:

header_filter_by_lua_block { lua-script-str } 或
header_filter_by_lua_file filepath

body_filter_by_lua_block { lua-script-str } 或
body_filter_by_lua_file filepath

执行阶段分别是:output-header-filter、output-body-filter
header_filter_by_lua_* :对每个请求执行这段 lua 代码,以此对响应头进行过滤。常用于对响应头进行添加、删除等 *** 作。用于设置输出body_filter_by_lua_* :响应体的过滤器。在此阶段可以修改响应体的内容,如修改字母的大小写、替换字符串等。

禁用的 lua API :

输出类型的API函数(如ngx.say和ngx.send_headers)。
控制类型的API函数(如ngx.exit)。
子请求的API函数(如ngx.location.capture和ngx.location.capture_multi)。
Cosocket API函数(如ngx.socket.tcp和ngx.req.socket)。

7、log_by_lua_*

使用方法:

log_by_lua_block { lua-script-str } 或
log_by_lua_file filepath

执行阶段:log
在日志请求处理阶段执行的{ lua-script }代码。它不会替换当前access请求的日志,而会运行在access的前面,适合用来对日志进行定制化处理,且可以实现日志的集群化维护

禁用的 lua API :

输出类型的API函数(如ngx.say和ngx.send_headers)。
控制类型的API函数(如ngx.exit)。
子请求的API函数(如ngx.location.capture和ngx.location.capture_multi)。
Cosocket API函数(如ngx.socket.tcp和ngx.req.socket)。
休眠API函数ngx.sleep。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5351217.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-09
下一篇 2022-12-09

发表评论

登录后才能评论

评论列表(0条)

保存