Tengine官方网站:http://tengine.taobao.org/index_cn.html
OpenResty官方网站:http://openresty.org/
Openresty和Tengine基于 Nginx 的两个衍生版本,某种意义上他们都和淘宝有关系,前者是前淘宝工程师章亦春主导开发的,后者是淘宝的一个开源项目
Openresty的最大特点是引入了ngx_lua模块,支持使用lua开发插件
Tengine的特点是融入了因淘宝自身的一些业务带来的新功能
OpenResty:
Nginx 是俄罗斯人发明的,Lua 是巴西几个教授发明的,中国人章亦春把 LuaJIT VM 嵌入到 Nginx 中,实现了 OpenResty 这个高性能服务端解决方案
通过 OpenResty,你可以把 nginx 的各种功能进行自由拼接, 更重要的是,开发门槛并不高,这一切都是用强大轻巧的 Lua 语言来操控。
它主要的使用场景主要是:
在 Lua 中揉和和处理各种不同的 nginx 上游输出(Proxy,Postgres,Redis,Memcached 等)
在请求真正到达上游服务之前,Lua 可以随心所欲的做复杂的访问控制和安全检测
随心所欲的操控响应头里面的信息
从外部存储服务(比如 Redis,Memcached,MySQL,Postgres)中获取后端信息,并用这些信息来实时选择哪一个后端来完成业务访问
在内容 handler 中随意编写复杂的 Web 应用,使用 同步但依然非阻塞 的方式,访问后端数据库和其他存储
在 rewrite 阶段,通过 Lua 完成非常复杂的 URL dispatch
用 Lua 可以为 nginx 子请求和任意 location,实现高级缓存机制
OpenResty又被称为ngx_openresty
,是基于Nginx的核心Web应用程序服务器。
OpenResty是基于Nginx和Lua的高性能Web平台,OpenResty通过汇聚各种设计精良的Nginx模块,从而将Nginx有效地变成一个强大的通用Web应用平台。
OpenResty的目标是让Web服务直接运行在Nginx服务内部,充分利用Nginx的非堵塞I/O模型,不仅对HTTP客户端请求,甚至对远程后端DB都进行一系列的高性能响应。
OpenResty借助于Nginx的事件驱动模型和非堵塞IO,以实现高性能的Web应用程序。
OpenResty使我们可以借助于Nginx的异步非阻塞达到使用Lua异步并发访问后端DB等服务。
OpenResty使用ngx.location.capture_multi
极大地减少浏览器的HTTP连接数量,可以异步并发的访问后台接口。
- OpenResty运行原理
Nginx采用的是master-worker
模型,也就是一个master
进程管理多个worker
进程,基本的时间处理都放在worker
进程中,master
进程负责全局初始化以及对worker
进行的管理。
OpenResty中,每个worker
进程使用一个LuaVM,当请求被分配到worker
时,将在这个LuaVM中创建一个coroutine
协程,协程之间数据隔离,每个协程都具有独立的全局变量。
- OpenResty处理请求流程
Nginx会把一个请求分成不同阶段,第三方模块可以根据自己的行为,挂在到不同阶段中以达到自身目的。OpenResty采用了同样的特性,不同阶段有着不同的处理行为。
Nginx
Nginx特点
- 轻量级的Web服务,比Apache占用更少内存及资源
- 抗并发Nginx处理请求,异步非阻塞。
- 高度模块化设计
Nginx设计为主进程和多个工作进程的工作模式,每个进程是单线程来处理多个连接,每个工作进程采用了非阻塞I/O来处理多个连接,从而减少线程上下文切换,从而实现高性能、高并发。因此,生产环境中会通过将CPU绑定给Nginx工作进程,从而提升性能。
Nginx架构
Nginx采用多进程模式,对于每个worker
进程都是独立的,因此不需要加锁,所以节省了锁带来的性能开销。采用独立的进程的好处在于worker
进程之间相互不会影响,当一个进程退出后,其他进程依然工作,以保证服务不会终端。
Nginx采用异步非堵塞的方式去处理请求,异步非堵塞就是当一个线程调用出现阻塞而等待时,其他线程可以去处理其他任务。
ngx_lua
ngx_lua
是将Lua嵌入Nginx,让Nginx执行Lua脚本,并且高并发、非阻塞的处理各种请求。Lua内建协程,可以很好的将异步回调转换成顺序调用的形式。ngx_lua
在Lua中进行的IO操作都会委托给Nginx的事件模型,从而实现非阻塞调用。开发者可以采用串行的方式编写程序,ngx_lua
会自动的在进行阻塞的IO操作中终端,保存上下文,然后将IO操作委托给Nginx事件处理机制,在IO操作完成后,ngx_lua会恢复上下文,程序继续执行,这些操作都是对用户程序透明的。
每个Nginx的worker
进程持有一个Lua解释器或LuaJIT实例,倍这个worker
处理的所有请求共享这个实例。每个请求的context
上下文会被Lua轻量级的协程分隔,从而保证各个请求时独立的。
ngx_lua
采用的`one-cor
ngx_lua
模块的原理
- 每个工作进程
worker
创建一个Lua虚拟机(LuaVM),工作进程worker
内部协议共享VM。
-每个Nginx I/O原语封装后注入Lua虚拟机,并允许Lua代码直接访问。 - 每个外部请求都由一个Lua协程处理,协程之间数据隔离。
- Lua代码调用I/O操作等异步时,会挂起当前协程,而不阻塞工作机进程。
- I/O等异步操作完成时,还原相关协程相关协议的上下文,并继续运行。
ngx_lua指令
Nginx与Lua编写脚本的基本构建块是指令,指令用于指定何时运行用户Lua代码以及如何使用结果。
ngx_lua指令执行顺序: