OpenResty 入门小结
实习有三个月了,这段期间做的 CDN 相关项目用的都是和 OpenResty 相关的技术栈,在这里记录一下这段时间学习 OpenResty 的小结。很多东西可能网上已经有更多更好的教程和例子了~ 我这边算是自己的一点笔记吧,有点流水帐。同时也太久没有发博客了……
什么是 OpenResty
OpenResty 本身应该叫做一个开源的 Web 平台,它的核心主要是 Nginx 和 lua-nginx-module。Nginx,我们知道是一个高性能的 Web Server,而 lua-nginx-module 则是一个基于 Nginx 插件,它使 Nginx 能够支持基于 Lua 语言的第三方开发。当然了,真正意义的 OpenResty 还包括更广泛的第三方库,为了提高性能还使用了 luajit。
关于 OpenResty 的入门,安装啥的,国内有人出了一本书 OpenResty最佳实践 基本上把入门必须的知识都涵盖了。
HTTP 请求处理的流程
对于初学者来说,理解 Nginx 和 OpenResty 中 HTTP 请求处理的流程是最重要的。Nginx 把 HTTP 请求拆分成了11个阶段,比如 NGX_HTTP_REWRITE_PHASE 执行 location 基本的重写指令, NGX_HTTP_CONTENT_PHASE 内容生成阶段,该阶段产生响应,并发送到客户端。同样的, lua-nginx-module 也提供了类似的处理机制,如图所示:
需要强调的是,不同执行阶段并不会因为你的代码顺序的变化而变化……很多人配置 Nginx 的时候容易犯这样的错误,因为不同的指令对应的阶段不一样。
timer
timer 会启动一个独立的协程处理定时任务。如果把时间设置成0,那么就可以看做一个异步的协程惹。
timer 有个很常用的地方就是……如何启动唯一的 timer?那就要把 timer 绑定在一个唯一的 worker 上。
init_worker_by_lua_block {
local delay = 3 -- in seconds
local new_timer = ngx.timer.at
local log = ngx.log
local ERR = ngx.ERR
local check
check = function(premature)
if not premature then
-- do the health check or other routine work
local ok, err = new_timer(delay, check)
if not ok then
log(ERR, "failed to create timer: ", err)
return
end
end
end
if 0 == ngx.worker.id() then
local ok, err = new_timer(delay, check)
if not ok then
log(ERR, "failed to create timer: ", err)
return
end
end
}
coroutine + socket = cosocket
cosocket 好像可以称为 OpenResty 中最牛逼的部分之一。如其名,它首先是 OpenResty 里处理套接字编程的工具,兼容 Lua Socket 库里的所有 API;其次,它是同步非阻塞的。不难猜到,cosocket 肯定封装了协程在其中。看官方解释有很多 Nginx 相关的调用,不是很明白,属于 TODO 学习的内容。
测试
春哥本人是个 Perl 顶尖选手。。OpenResty 的测试是用 Perl 写的一个 DSL。。只能说太牛逼了,以后慢慢填坑吧。