笔记 | OpenResty系列课程

观看OpenResty 系列课程的学习笔记

用 OpenResty 快乐的搭建高性能服务端

1.1 OpenResty简介

高性能服务端的两个特点:

  • 缓存(内存>SSD>机械磁盘,本机>网络,进程内>进程外)
  • 异步非阻塞(事件驱动)

1.2 hello world

参考资料:

OpenResty = Nginx + LuaJIT(LuaJIT虚拟机嵌在Nginx worker中)

lua_code_cachelua代码缓存,默认开启,支持set_by_lua_filecontent_by_lua_file等指令和lua模块,关闭后方便开发(不用重启Nginx),生产环境建议开启(影响性能)

content_by_lua_file:指定要执行的lua文件

1.3 OpenResty入门

书籍:openresty最佳实践

运行时的错误日志保存在logs/error.log

nginx.conf示例片段:

1
2
3
location = /api/random {
content_by_lua_file lua/random.lua;
}

random.lua

1
2
3
4
5
6
7
8
local args = ngx.req.get_uri_args() --max is 100,set 0 to unlimit
local salt = args.salt
if not salt then
ngx.exit(ngx.HTTP_BAD_REQUEST)
end
local string = ngx.md5(ngx.time() .. salt)
ngx.say(string)

1.4 ngx lua API介绍

Tips: 不要使用 lua API(阻塞),要用ngx lua API(非阻塞)

1.5 连接数据库

Tips: 数据库操作的代码逻辑看上去是同步的,但是内部实现是异步的

主要有lua-resty-redislua-resty-mysql

1.6 OpenResty缓存

  • share_dict: 字典缓存,纯内存缓存,可以预设内存大小,多个worker共享,需要锁操作
  • lua-resty-lrucache:可以预设key个数,单个worker使用,内存使用翻倍

缓存失效风暴:在缓存超时时间触发的瞬间,所有的并发请求都同时执行数据库查询操作,数据库压力瞬间变大,下次请求又全部进入缓存,压力瞬间变小,出现两个极值。可以使用lua-resty-lock对数据库查询操作加锁,使数据库查询只进行一次

1.7 FFI和第三方模块

FFILuaJIT的一个库,可以在LuaJIT中调用C的数据结构和外部C函数。如random.lua
第三方模块:放在/openresty/lualib/resty目录下。

1.8 子查询

ngx.location.capturengx.location.capture_multi:在一个location内部,对另一个location进行请求,因为这不是http请求,是C级别的调用,所以有开销小的优点; 同时可以降级服务(某一个非关键服务down掉,可以继续使用),开放给前端就一个api接口即可,在这个api接口内做多个子查询,不需要前端调用多个api进行查询,避免由于某一个api服务挂掉而导致阻塞

1
2
3
4
5
6
7
8
9
10
11
12
location = /api/test_parallels {
content_by_lua_block {
local start_time = ngx.now()
local res1, res2 = ngx.location.capture_multi({
{"/sum",{args={a=3, b=8}}},
{"/subduction",{args={a=3, b=8}}},
})
ngx.say("status:", res1.status, "response:", res1.body)
ngx.say("status:", res2.status, "response:", res2.body)
ngx.say("time used:", ngx.now()-start_time)
}
}

1.9 执行阶段

这个是NginxOpenResty独有的概念,不同的阶段有不同的处理行为,可参考执行阶段概念

常用命令

更改conf后,检查conf文件是否正确:nginx -t -c [conf]
重启:nginx:nginx -s reload -p [path]

Reference

About me

forthebadge

Creative Commons License This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。