openresty的lua开发入门

Lua脚本#

这里有一份lua快速入门,不够详细,不够全面.但是可以快速扫一眼lua的风格,也可以大概速查一下

https://www.w3cschool.cn/lua/lua-tutorial.html

Openresty快速入门#

Openresty是一个华人章亦春主导发起的开源项目,将lua的灵活性注入nginx,利用高性能为nginx带来更多的想象空间.官方定义是

Openresty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

官网 https://openresty.org/cn/

这里有一个360的工程师写的比较友好的入门资料<<OpenResty 最佳实践>>

https://moonbingbing.gitbooks.io/openresty-best-practices/content/

下面摘录一些可以快速入门的东西

Openresty引入lua#

openresty中nginx引入lua方式

  • xxx_by_lua —>字符串编写方式,不建议使用

  • xxx_by_lua_block ---->代码块方式,可以少量lua脚本的时候使用

  • xxx_by_lua_file ---->直接引用一个lua脚本文件,大量复杂逻辑的时候使用

    xxx是如:

    7个阶段的执行顺序如下:

    • set_by_lua: 流程分支判断,判断变量初始哈
    • rewrite_by_lua: 用lua脚本实现nginx rewrite
    • access_by_lua: ip准入,是否能合法性访问,防火墙
    • content_by_lua: 内容生成
    • header_filter_by_lua:过滤http头信息,增加头信息
    • body_filter_by_lua: 内容大小写,内容加密
    • log_by_lua: 本地/远程记录日志

https://www.cnblogs.com/reblue520/p/11434252.html

https://www.cnblogs.com/digdeep/p/4859575.html

这是openresty官方给的最简单的一个例子,openresty使用content_by_lua_block后面可以直接在{}中写lua脚本、也可以用content_by_lua_file /path/to/luafile.lua在一个单独的lua文件中处理.

1
2
3
4
5
6
7
8
9
10
11
12
http {
server {
listen 8080;
location / {
default_type text/html;
content_by_lua_block {
-- 此处是lua命令,ngx.say是输出一个响应
ngx.say("<p>hello, world</p>")
}
}
}
}

可以分阶段处理,如利用 access 阶段做一些非标准 HTTP(S)上的自定义修改,但对于已有业务是不需要任何感知的。

如api版本升级,新增加密\防篡改,调用方升级太多的时候可以用openresty去兼容老版本.真正的业务在content_by_lua_file中完成,应用只用维护一个新版即可.

1
2
3
4
5
location ~ ^/api/([-_a-zA-Z0-9/]+).json {
access_by_lua_file /path/to/lua/api/protocal_decode.lua; -- 处理协议解码,请求过滤
content_by_lua_file /path/to/lua/api/$1.lua; -- 业务处理,不用关注版本
body_filter_by_lua_file /path/to/lua/api/protocal_encode.lua; --根据版本编码
}

引用第三方库#

我们以 resty.http ( pintsized/lua-resty-http) 库为例。

只要将 lua-resty-http/lib/resty/ 目录下的 http.lua 和 http_headers.lua 两个文件拷贝到 /usr/local/openresty/lualib/resty 目录下即可(假设你的 OpenResty 安装目录为 /usr/local/openresty)。

放在其他地方的话,需要指定一下扫描路径

https://moonbingbing.gitbooks.io/openresty-best-practices/content/ngx_lua/how_use_third_lib.html

cosocket#

coroutine协程+socket

https://moonbingbing.gitbooks.io/openresty-best-practices/content/ngx_lua/whats_cosocket.html

TIME_WAIT#

https://moonbingbing.gitbooks.io/openresty-best-practices/content/web/time_wait.html

灰度发布#

其实就是openresty根据redis里面的ip范围,将某些用户的响应给代理到新的服务上.

https://moonbingbing.gitbooks.io/openresty-best-practices/content/test/abtest.html

https://www.cnblogs.com/Eivll0m/p/6774622.html

redis连接#

https://moonbingbing.gitbooks.io/openresty-best-practices/content/web/conn_pool.html

C10K#

https://moonbingbing.gitbooks.io/openresty-best-practices/content/web/c10k.html