nginx如何结合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(epoll等系统调用)来处理多个连接;

        在生产环境中会通过把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

猜你喜欢

转载自blog.csdn.net/yangguangmeng/article/details/83152589