OpenResty 101

本文是 OpenResty 的初学者指南,提供一些资料的汇总。

OpenResty

OpenResty

初学者在刚开始学习 OpenResty 的时候,最好能先对 Nginx 有一定的了解,推荐阅读 OpenResty 作者 agentzh 撰写的 Nginx 教程,有中文版英文版

一旦对 Nginx 有了基本的认知,那么可以读十遍 lua-nginx-module 的官方文档,同时 iresty 上还提供了一份中文文档,文档中很多细节都值得牢记。

比如在描述 ngx.print 的时候,文档中提到:「This is an asynchronous call and will return immediately without waiting for all the data to be written into the system send buffer. To run in synchronous mode, call ngx.flush(true) after calling ngx.print.」,看上去很简单,无非是说 ngx.print 是异步的,不过如果你忽视了这一点,那么很可能会掉坑里:

我见过有人在热代码里执行 ngx.print,结果导致卡顿,究其原因,正是因为 ngx.print 是异步的,调用后直接返回,正确的做法是在适当的时候执行 ngx.flush(true)。

此外,在描述 ngx.say 的时候,文档中提到:「Just as ngx.print but also emit a trailing newline.」,看上去很简单,无非是说 ngx.say 比 ngx.print 多了一个新行,不过如果你忽视了这一点,那么很可能会掉坑里:

我见过有人输出了 Content-Length 响应头后,接着用 ngx.say 输出相应体,结果报错。究其原因,正是因为 ngx.say 多了一个新行,导致 Content-Length 不匹配。

类似的细节还有很多,不再赘述,此外,还有一些开源的电子书值得推荐,比如:

理论知识学习的差不多了之后,有时间的话推荐把讨论组(中文英文)里的帖子从头到尾捋一遍,倒不用非得捋得多仔细,更重要的是看看别人是如何解决问题的。

比如很多性能问题都是用火焰图解决的,其又分为 On-CPU 和 Off-CPU,如何选择?

如果瓶颈是 CPU 则使用 On-CPU 火焰图,如果瓶颈是 IO 或锁则使用 Off-CPU 火焰图。如果无法确定,那么可以通过压测工具来判断:通过压测工具看看能否让 CPU 使用率趋于饱和,如果能那么使用 On-CPU 火焰图,如果不管怎么压,CPU 使用率始终上不来,那么多半说明程序被 IO 或锁卡住了,此时适合使用 Off-CPU 火焰图。如果还是确认不了,那么不妨 On-CPU 火焰图和 Off-CPU 火焰图都搞搞,正常情况下它们的差异会比较大,如果两张火焰图长得差不多,那么通常认为 CPU 被其它进程抢占了。

如果使用 On-CPU,压测工具把 CPU 压得越满结果越准确;如果使用 Off-CPU,则不必如此,毕竟在 Off-CPU 的时间段内,进程的用户态调用栈和内核调用栈都不会发生变化。

关于压测工具,如果使用 ab 的话,一定要记得开启 -k 选项,否则可能会遇到端口不足的问题。当然 wrk 也不错。

当你用 OpenResty 写项目的时候,最好站在巨人的肩膀上,多使用一些成熟的开源组件,不过需要注意有些 Lua 库可能并不兼容 OpenResty 的非堵塞特性,在你选择的时候务必留心,尤其是那些使用了 LuaSocket 而不是 CoSocket 的库,一个相对安全的选择是只在 opm 或者 awesome-resty 上找,质量有保证。

Github 上 lua-resty-* 相关的项目最好也都留意一下,特别是如下几个公司的账户:

赞扬下 upyun,作为国内技术流公司,对社区贡献良多。

此外,再推荐几个组织或个人的账户(排名不分先后):

不多说了,撸起袖子干吧。

1 thought on “OpenResty 101

发表评论

电子邮件地址不会被公开。 必填项已用*标注