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 也提供了类似的处理机制,如图所示:

openresty_phases.png

需要强调的是,不同执行阶段并不会因为你的代码顺序的变化而变化……很多人配置 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。。只能说太牛逼了,以后慢慢填坑吧。