观看OpenResty 系列课程的学习笔记
用 OpenResty 快乐的搭建高性能服务端
1.1 OpenResty简介
高性能服务端的两个特点:
- 缓存(内存>SSD>机械磁盘,本机>网络,进程内>进程外)
- 异步非阻塞(事件驱动)
1.2 hello world
参考资料:
OpenResty = Nginx + LuaJIT(LuaJIT虚拟机嵌在Nginx worker中)
lua_code_cache:lua
代码缓存,默认开启,支持set_by_lua_file
和content_by_lua_file
等指令和lua
模块,关闭后方便开发(不用重启Nginx),生产环境建议开启(影响性能)
content_by_lua_file:指定要执行的lua
文件
1.3 OpenResty入门
运行时的错误日志保存在logs/error.log
中
nginx.conf
示例片段:
1 | location = /api/random { |
random.lua
:
1 | local args = ngx.req.get_uri_args() --max is 100,set 0 to unlimit |
1.4 ngx lua API介绍
Tips: 不要使用
lua API
(阻塞),要用ngx lua API
(非阻塞)
1.5 连接数据库
Tips: 数据库操作的代码逻辑看上去是同步的,但是内部实现是异步的
主要有lua-resty-redis和lua-resty-mysql
1.6 OpenResty缓存
- share_dict: 字典缓存,纯内存缓存,可以预设内存大小,多个
worker
共享,需要锁操作 - lua-resty-lrucache:可以预设
key
个数,单个worker
使用,内存使用翻倍
缓存失效风暴:在缓存超时时间触发的瞬间,所有的并发请求都同时执行数据库查询操作,数据库压力瞬间变大,下次请求又全部进入缓存,压力瞬间变小,出现两个极值。可以使用lua-resty-lock对数据库查询操作加锁,使数据库查询只进行一次
1.7 FFI和第三方模块
FFI
:LuaJIT
的一个库,可以在LuaJIT
中调用C
的数据结构和外部C
函数。如random.lua
第三方模块:放在/openresty/lualib/resty
目录下。
1.8 子查询
ngx.location.capture
和ngx.location.capture_multi
:在一个location
内部,对另一个location
进行请求,因为这不是http
请求,是C
级别的调用,所以有开销小的优点; 同时可以降级服务(某一个非关键服务down
掉,可以继续使用),开放给前端就一个api
接口即可,在这个api
接口内做多个子查询,不需要前端调用多个api
进行查询,避免由于某一个api
服务挂掉而导致阻塞
1 | location = /api/test_parallels { |
1.9 执行阶段
这个是Nginx
和OpenResty
独有的概念,不同的阶段有不同的处理行为,可参考执行阶段概念
常用命令
更改conf后,检查conf文件是否正确:nginx -t -c [conf]
重启:nginx:nginx -s reload -p [path]