你好,我是温铭,OpenResty 软件基金会主席,曾任某开源商业公司合伙人,前 360 开源技术委员会委员,在互联网安全公司工作了 10 年,负责开发过云查杀、反钓鱼和企业安全产品。接下来的几个月,我会带着你系统地学习一下 OpenResty。

为什么学习 OpenResty

为什么学习 OpenResty,这是开篇的第一个问题。我们正身处技术日新月异的时代,经常听到周围的工程师开玩笑说,学不动了。人的精力有限,选择学习某个技术都会有机会成本。最好的选择,是从你工作中涉及到的部分出发,学以致用。

对于服务端工程师来说,如果你的工作中涉及到 NGINX、高性能、高并发、动态控制、性能测试和分析等,那么不管开发语言和平台是什么,这门 OpenResty 课程都会让你有所裨益。如果你之前没有接触过 OpenResty,我确信它会给你打开另外一个服务端世界的大门。

OpenResty 是一个兼具开发效率和性能的服务端开发平台,虽然它基于 NGINX 实现,但其适用范围,早已远远超出反向代理和负载均衡

它的核心是基于 NGINX 的一个 C 模块(lua-nginx-module),该模块将 LuaJIT 嵌入到 NGINX 服务器中,并对外提供一套完整的 Lua API,透明地支持非阻塞 I/O,提供了轻量级线程、定时器等高级抽象。同时,围绕这个模块,OpenResty 构建了一套完备的测试框架、调试技术以及由 Lua 实现的周边功能库。

你可以用 Lua 语言来进行字符串和数值运算、查询数据库、发送 HTTP 请求、执行定时任务、调用外部命令等,还可以用 FFI 的方式调用外部 C 函数。这基本上可以满足服务端开发需要的所有功能。

掌握好了 OpenResty,你就可以同时拥有脚本语言的开发效率和迭代速度,以及 NGINX C 模块的高并发和高性能优势。

我与 OpenResty 的渊源

说了这么多 OpenResty 的特点,我又是怎样与它结缘的呢?其实,我是在 2012 年开始接触 OpenResty 的,那会儿我正在为一个新的系统做技术选型,作为一个 Python 的忠实粉丝,我不喜欢 NGINX C 模块的艰涩,却希望得到它的高性能,鱼与熊掌想兼得。该怎么办呢?

经过一番搜寻后,我发现了 Python 社区“大妈”ZQ 的一篇介绍 OpenResty 的文章,可以说是如获至宝。不过,兴奋只持续了很短的时间,因为之后的我,就像是无头苍蝇一样,开始在黑暗中摸索着缓慢前行。踩了数不清的坑后,我才真正拿下了 OpenResty。

和很多工程师不同的是,我喜欢写文章,在大学期间就一直维护着自己的技术博客。有一天晚上加班时,我发现身边一位工程师在用 GitHub 记录 ELK 的使用心得,并发布到了 GitBook 上。原来 GitHub 还可以开源书籍,而不只是代码!

我一下子就被点燃了,当晚就列出了《OpenResty 最佳实践》的目录,并开始“鼓动”周围的工程师加入。我们从未宣传过这个开源项目,但它慢慢变成了 OpenResty 入门者的最佳伙伴。

不过,在加入 OpenResty Inc. 后,我才逐渐发现,能写出正确的 OpenResty 代码并避免常见的坑,和写出高性能、优质的 OpenResty 代码之间,还相差了十万八千里。而跨越这个巨大鸿沟的法宝零件,散落在 OpenResty 开源项目的源码、文档、issue、PR、幻灯片、邮件列表中,需要你把它们串联成真正的法宝——一个完整的学习体系和知识图谱

那如何才能体系化学习 OpenResty 呢?在 OpenResty 的技术交流群里面,很多工程师都曾经有过这样的困惑。

事实上,OpenResty 的学习资料还比较少,官方只有 API 文档,并没有提供入门和进阶的文档,而网上能找到的资料也不够系统。可以说,绝大部分的 OpenResty 使用者都是在摸着石头过河,过程很痛苦。

因此,我与极客时间合作了这个专栏,目的很明确,就是让你轻松快速地入门,并给你描绘出 OpenResty 的全貌,帮你建立知识体系,带你真正掌握 OpenResty 这款开发利器。

学习这个专栏需要什么基础?

OpenResty 是在 NGINX 和 LuaJIT 的基础上搭建的,所以我们肯定需要 NGINX 和 LuaJIT 的基础知识。

但你只需要很少的 NGINX 知识,就足够开始 OpenResty 之旅了。少到什么程度呢?涉及到的 NGINX 知识,我只用一节课就介绍完了。即使你完全没有接触过 NGINX,也可以跟着课程的节奏,逐步学习 OpenResty。

要知道,OpenResty 并不等同于 NGINX,OpenResty 这个项目的目的之一,就是让你感知不到 NGINX 的存在。

而从编程语言来看,Lua 是一种很容易理解的语言,你只要能够看懂它的代码,就可以完成本专栏的学习,并不需要能够独立写出复杂的 Lua 代码。同样的,我也会花少数几节课的时间,带你入门 Lua,达到 OpenResty 的使用水准。

从实战中来,到实战中去

实践出真知,这句话用在互联网技术的学习上很恰当。

和理论偏多的书籍不同,专栏的形式本身更偏重于实战。专栏中出现的不少代码,都源自开源 OpenResty 的测试案例,以及实际的开源项目。引用这些实际案例,就是希望你在入门之初,就能接触到最优秀的代码,了解到最真实的使用场景。

同时,我还会在专栏文章中,穿插多个视频课程。视频课的内容,都取自真实开源项目的功能点和 PR。通过视频,你会亲眼看到,刚刚学到的知识是如何在实际中使用的。

专栏最后的实战部分,则是我们的真实“战场”。我会带你一起,用 OpenResty 从零搭建一个微服务 API 网关。根据我们在社区中的统计,接近一半的 OpenResty 使用者,都把 OpenResty 用在 API 网关的开发上,Kong 和 orange 则是 OpenResty 领域中最流行的两个开源网关项目。你想自己从头搭建一个更简单、更高性能的 API 网关吗?一起来吧。

从实际的开源项目中学习,再到实际的开源项目中去实战,将实战融入完整的知识体系,这便是我的教学理念,希望你喜欢这种方式。

万尺高楼平地起,接下来,我会和你一起来逐步掌握 OpenResty,Enjoy!