首先,openResty采取的是Lua语言,所以首要的是需要掌握必要的Lua语法,最快的方案是找一个OpenResty的开源项目来读源码。这里就使用 orange。
了解OpenResty
openResty官方中文文档openResty基于Nginx和LuaJIT开发,是CDN的技术标准。拥有丰富的lua-resty库,形成了自己的生态体系,在API网关和软WAF等领域被广泛应用。
OpenResty的特性
- 文档详尽,测试用例比较丰富
- 自带命令行工具restydoc,通过shell查看文档
- 同步非阻塞:支持协程,实现了同步非阻塞的编程模式,即对于当前线程中的程序是顺序执行的,但是也可以处理其他程序,而如果被同步掉的代码在等待的时候,会接着执行下面的代码,直到遇到同步部分的结果被使用的时候才会等待结果返回。这个在python多线程编程的时候也遇到过。
- 动态:由脚本语言 Lua动态修改配置,通过 OpenResty 中 lua-nginx-module 模块中提供的 Lua API,我们可以动态地控制路由、上游、SSL 证书、请求、响应等
由于其可动态修改web服务的特性,使得serverless和边缘计算也可以用OpenResty来做。
需要重点掌握的知识
- 同步非阻塞的编程模式
- openResty在一个web请求中的不同阶段的作用
- LuaJIT和Lua的不同之处
- OpenResty API的周边库
- 协程和cosocket
- 单元测试框架和性能测试工具
- 火焰图和周边工具链
- 性能优化
首先,由于windows环境和linux环境有较大差异,所以我不建议使用windows作为开发环境,既然互联网上关于在linux上构建openresty的比较多,最后就只采取linux作为开发环境。
安装OpenResty
centos安装OpenResty官方文档
命令行工具Resty
resty 本质上是启动了一个 NGINX 服务
一个简单的例子
来到一个用户目录下,创建logs目录和conf目录,并在conf目录下创建一个nginx.conf的例子,代码如下:
events { worker_connections 1024; } http { server { listen 8080; location / { content_by_lua ' ngx.say("hello, world") '; } } }
然后启动指定该配置文件启动项目
openresty -c conf/nginx.conf
打开浏览器访问的结果如下(在这之前确保你的安全组是打开了的):
openResty的关闭似乎不是很好用,建议使用
netstat -anop | grep port
获取pid,然后kill掉。
然后将ngx.say("hello, world")这一串代码改成放到lua脚本中,那么配置文件改为:
user root; pid logs/nignx.pid; events { worker_connections 1024; } http { server { listen 8081; location / { content_by_lua_file lua/demo.lua; } } }
我这里使用了user root,是由于我没有新建一个用户来做实验,而nginx的默认用户是nginx,没有lua文件的权限。这里可以考虑新建一个用户来做实验。最终的结果如下: 那么怎么让修改及时生效呢?而不需要每次都kill掉程序?Lua 代码在第一个请求时会被加载,并默认缓存起来。所以在你每次修改 Lua 源文件后,都必须重新加载 OpenResty 才会生效。其实,在 nginx.conf 中关闭 lua_code_cache 就能避免重新加载,这一点你可以自己试试看。不过,特别需要注意的是,这种方法只能临时用于开发和调试,如果是线上部署,一定要记得打开缓存,否则会非常影响性能。
openresty中官方实现了很多不同类型的库,例如包含 18 个 lua-resty-* 库,涵盖 Redis、MySQL、memcached、websocket、dns、流量控制、字符串处理、进程内缓存等常用库。
分析开源项目Orange
首先,了解一下Orange,Orange 是一个基于 OpenResty 的API网关。除 Nginx 的基本功能外,它还可用于API监控、访问控制(鉴权、WAF)、流量筛选、访问限速、AB测试、静/动态分流 等。
说句实在的,它已经实现了绝大部分的功能,
项目目录结构
- api
- 目测是提供的接口,官方文档中提到了该项目提供了API接口用于实现第三方服务
- bin
- 应该是运行目录,里面主要是lua的一些第三方包
- conf
- 配置模板,类比nginx中的配置
- dashboard
- 控制台程序
- docs
- 运行文档
- install
- 安装方法,包含了sql语句和安装执行脚本
- orange
- 也是一些Lua的代码,主要是核心代码所在地
- rockspec
- 似乎是对该项目的打包,类似于java的jar一样,相当于给别人直接使用
- test
- 测试库
核心知识点
需要掌握的Lua代码
我打算以下面的步骤进行学习
- 首先需要知道其包管理工具为luarocks
- 同时也需要一个Lua的运行环境
- ide
- hello world
- 线上运行方式:打包、部署
- 实际的openResty的开发
好了,下一节就详细介绍Lua的各种语法和方法
必须掌握的Lua知识点
构建Lua项目环境
LuaJIT是相对于Lua更为主流的存在
架构设计
- 首先是存储,你需要设计出一个存储模块,不能所有东西都走缓存:可以考虑仅仅只走文件系统。
- 旁路监听,不影响网络的性能,只做分析和拦截建议