OpenResty?ngx_lua?Nginx与ngx_lua结合?

什么是OpenResty?

将Lua和Nginx粘合ngx_lua模块,并且将Nginx核心、LuaJIT、ngx_lua模块、许多有用的Lua库和常用的第三方Nginx模块组合而成。

 

 

什么是ngx_lua及原理?

ngx_lua是Nginx的一个模块,将Lua嵌入到Nginx中,从而可以使用Lua来编写脚本,这样就可以使用Lua编写应用脚本,部署到Nginx中运行,即Nginx变成了一个Web容器。

注:Tengine也包含ngx_lua模块。至于二者的区别:OpenResty是Nginx的Bundle;而Tengine则是Nginx的Fork。

ngx_lua模块的原理:

1、每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM;

2、将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问;

3、每个外部请求都由一个Lua协程处理,协程之间数据隔离;

4、Lua代码调用I/O操作等异步接口时,会挂起当前协程(并保护上下文数据),而不阻塞worker;

5、I/O等异步操作完成时还原相关协程上下文数据,并继续运行;

 

 

为什么Nginx与ngx_lua结合?

Nginx设计为一个主进程多个工作进程的工作模块,每个进程是单线程处理多个连接,而且每个工作进程采用了非阻塞I/O(select()、poll()等系统调用)来处理多个连接,从而减少了线程上下文切换,从而实现了公认的高性能、高并发;在生产环境中会通过把CPU绑定到Nginx工作进程提升性能;另外因为单线程工作模式的特点,内存占用就非常少了。Nginx更改配置重启速度非常快,可以毫秒级,而且支持不停止Nginx进行升级Nginx版本、动态重载Nginx配置。

每个Nginx worker(工作进程)会创建一个Lua VM(Lua虚拟机)。每个外部请求进入Nginx绑定一个worker进行处理。worker内部针对每一个请求由Lua VM产生一个协程(此协程执行Lua代码进行业务处理),业务处理完毕请求返回后,由Lua VM回收此协程。逻辑上看,每个外部请求生命周期都是在Lua VM中由一个协程完成。

 

参考链接

Nginx与Lua

http://www.cnblogs.com/wangxusummer/p/4284229.html

ngx_lua 模块

http://www.cnblogs.com/wangxusummer/p/4309007.html

使用Nginx+Lua(OpenResty)开发高性能Web应用

http://jinnianshilongnian.iteye.com/blog/2280928

 

 

 

猜你喜欢

转载自murray2081.iteye.com/blog/2353873