关于bootstrap:高性能网关基石OpenResty

58次阅读

共计 3793 个字符,预计需要花费 10 分钟才能阅读完成。

什么是 OpenResty
OpenResty 一个基于 Nginx 的高性能 Web 平台,可能不便地搭建解决超高并发的动静 Web 利用、Web 服务和动静网关。例如有名的 Kong 网关和国产新秀 ApiSIX 网关都是基于 OpenResty 来进行打造的。

OpenResty 通过实现 ngx_lua 和 stream_lua 等 Nginx 模块,把 Lua/LuaJIT 完满地整合进了 Nginx,从而让咱们可能在 Nginx 外部里嵌入 Lua 脚本,用 Lua 语言来实现简单的 HTTP/TCP/UDP 业务逻辑,同时仍然放弃着高度的并发服务能力。

解决阶段
一个失常的 Web 服务的生命周期能够分成三个阶段:

initing:服务启动,读取配置文件,初始化外部数据结构
running:服务运行,承受客户端的申请,返回响应后果
exiting:服务进行,做一些必要的清理工作,如敞开监听端口
OpenResty 次要关注的是 initing 和 running 这两个阶段,并做了更粗疏的划分

OpenResty 的 initing 阶段
configuration:读取配置文件,解析配置指令,设置运行参数
master-initing:配置文件解析结束,master 过程初始化专用的数据
worker-initing:worker 过程初始化本人专用的数据
OpenResty 的 running 阶段
在 running 阶段,收到客户端的申请后,OpenResty 对每个申请都会应用上面这条流水线进行解决:

ssl:SSL/TLS 平安通信和验证
preread:在正式解决之前预读数据,接管 HTTP 申请头
rewrite:查看、改写 URI,实现跳转重定向
access:拜访权限管制
content:产生响应内容
filter:对 content 阶段产生的内容进行过滤加工解决
log:申请处理完毕,记录日志,或者其余的收尾工作。
openresty-phase.png

OpenResty 执行程序
OpenResty 依据下面的解决阶段提供了一些指令,在开发时应用它们就能够在这些阶段外面插入 Lua 代码,执行业务逻辑:

init_by_lua_file:master-initing 阶段,初始化全局配置或模块
init_worker_by_lua_file:worker-initing 阶段,初始化过程专用性能
ssl_certificate_by_lua_file:ssl 阶段,在握手时设置平安证书
set_by_lua_file:rewrite 阶段,改写 Nginx 变量
rewrite_by_lua_file:rewrite 阶段,改写 URI,实现跳转或重定向
access_by_lua_file:access 阶段,访问控制或限速
content_by_lua_file:content 阶段,产生响应内容
balancer_by_lua_file:content 阶段,反向代理时抉择后端服务器
header_filter_by_lua_file:filter 阶段,加工解决响应头
body_filter_by_lua_file:filter 阶段,加工解决响应体
log_by_lua_file:log 阶段,记录日志或其余的收尾工作
这些指令通常有三种模式:

xxx_by_lua:执行字符串模式的 Lua 代码:
xxx_by_lua_block:性能雷同,但指令后是{ ...}的 Lua 代码块
xxx_by_lua_file:性能雷同,但执行磁盘上的 Lua 源码文件。这边举荐应用 xxx_by_lua_file,它彻底拆散了配置文件与业务代码,让两者能够独立部署,而且文件模式也让咱们更容易以模块的形式治理组织 Lua 程序。
上面是 OpenResty 指令所在的阶段和执行的先后顺序图

openrestyflow.png

Demo 编写
为了可能直观的看到下面的解决阶段, 接下来编写一个 OpenResty 的 小 demo. 先在本地电脑上装置 OpenResty 而后执行上面命令看看有没有装置胜利, 如果装置胜利了, 就会呈现版本号

$ sudo openresty -v
nginx version: openresty/1.21.4.1
复制代码
而后执行上面命令创立一些文件夹:

mkdir testresty &&
cd testresty &&
mkdir logs conf service &&
cd logs && touch error.log && touch access.log
复制代码
创立实现后, 文件目录构造就像上面这样:

├── conf
├── logs
│ ├── access.log
│ └── error.log
└── service
复制代码
其中, conf 文件夹是寄存 nginx.conf 等配置的中央, 而后本人编写的 lua 代码文件能够放在 service 文件夹下. 接下来, 创立和编写每个阶段所需的 lua 脚本文件, 只在外面编写一条打印日志的代码, 而后放进 service 文件夹下

rewrite.lua
ngx.log(ngx.ALERT,”this is rewrite”)
复制代码
access.lua
ngx.log(ngx.ALERT,”this is access”)
复制代码
content.lua
ngx.log(ngx.ALERT,”this is content”)
— 响应内容
ngx.say(‘hello world’)
复制代码
header_filter.lua
ngx.log(ngx.ALERT,”this is header_filter”)
复制代码
body_filter.lua
ngx.log(ngx.ALERT,”this is body_filter”)
复制代码
log.lua
ngx.log(ngx.ALERT,”this is log”)
复制代码
编写 nginx.conf 配置文件, 放进 conf 文件夹下

user root;

worker_processes 1;
events {

worker_connections  512;

}

http {

server {
    listen  80;

    location / {
        rewrite_by_lua_file service/rewrite.lua;
        access_by_lua_file service/access.lua;
        content_by_lua_file service/content.lua;
        header_filter_by_lua_file service/header_filter.lua;
        body_filter_by_lua_file service/body_filter.lua;
        log_by_lua_file service/log.lua;
    }

}

}
复制代码
而后启动 OpenResty, 应用 -p 选项, 传入你下面创立的文件夹地址

$ sudo openresty -p $HOME/testresty
复制代码
启动实现后, 而后用浏览器拜访 http://localhost, 能够看到下面通过 ngx.say(‘hello world’) 的响应内容设置返回的 hello world. 关上 logs/error.log 文件, 能够看到 Lua 代码里打印的日志:

2022/12/26 15:59:26 [alert] 31700#0: *119 [lua] rewrite.lua:1: this is rewrite, client: 127.0.0.1, server: , request: “GET / HTTP/1.1”, host: “localhost”
2022/12/26 15:59:26 [alert] 31700#0: *119 [lua] access.lua:1: this is access, client: 127.0.0.1, server: , request: “GET / HTTP/1.1”, host: “localhost”
2022/12/26 15:59:26 [alert] 31700#0: *119 [lua] content.lua:1: this is content, client: 127.0.0.1, server: , request: “GET / HTTP/1.1”, host: “localhost”
2022/12/26 15:59:26 [alert] 31700#0: *119 [lua] header_filter.lua:1: this is header_filter, client: 127.0.0.1, server: , request: “GET / HTTP/1.1”, host: “localhost”
2022/12/26 15:59:26 [alert] 31700#0: *119 [lua] body_filter.lua:1: this is body_filter, client: 127.0.0.1, server: , request: “GET / HTTP/1.1”, host: “localhost”
2022/12/26 15:59:26 [alert] 31700#0: *119 [lua] body_filter.lua:1: this is body_filter, client: 127.0.0.1, server: , request: “GET / HTTP/1.1”, host: “localhost”
2022/12/26 15:59:26 [alert] 31700#0: *119 [lua] log.lua:1: this is log while logging request, client: 127.0.0.1, se

正文完
 0