AnSwErYWJ's Blog

笔记 | OpenResty系列课程

字数统计: 782阅读时长: 16 min
2017/06/20

观看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

原文作者:AnSwErYWJ

原文链接:https://answerywj.com/2017/06/20/note-of-openresty-study/

发表日期:2017/06/20 17:06

版权声明:本文采用Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License进行许可.
Creative Commons License

CATALOG
  1. 1. 用 OpenResty 快乐的搭建高性能服务端
    1. 1.1. 1.1 OpenResty简介
    2. 1.2. 1.2 hello world
    3. 1.3. 1.3 OpenResty入门
    4. 1.4. 1.4 ngx lua API介绍
    5. 1.5. 1.5 连接数据库
    6. 1.6. 1.6 OpenResty缓存
    7. 1.7. 1.7 FFI和第三方模块
    8. 1.8. 1.8 子查询
    9. 1.9. 1.9 执行阶段
  2. 2. 常用命令
  3. 3. Reference