`

用lua让nginx成为应用服务器

阅读更多

       相遇是件难得的事情,在一起更不简单,但是nginx和lua就是成功的结合起来。文本将以演进式方式与大家一起分享lua的威力和nginx的优秀架构。

 

1、从猩猩那个年代说起

从互联网进入人类生活开始,用户和服务器就扮演着你来我往的角色,从技术角度描绘就是一直存在着request/response(请求/响应)的架构。如今随着网络设施的加强,人们对网站内容的需求也更多样化,从简单的html到现在丰富的媒介内容。横空出世的开源服务器软件也承担着更多的功能。但是再怎么复杂变化,总是只有静态和动态两种类型。静态即静态资源如html、css、js等这种文件式的内容,动态即根据请求信息处理的如.php这种常见的内容。在静态方面,现在已经有足够成熟的架构方案,反倒动态的处理方案非常之多。

 

2、站在巨人的肩上

可以说提到web服务器,人们自然会想到apache,这个在技术发展史上不能被忽略的优秀软件,如今依然有着60%(保守估计)的使用量。nginx是个极致的东西,优势的架构让它迅速征服了很大一批工程师,这同样适合国内的情况。nginx做了两件事:处理静态请求和动态请求。完全符合我们上面说的,在静态方面,nginx的性能表现非常突出,默认使用sendfile传输内容,还可以设置缓存(针对file fd)。在动态方面,nginx可以集成很多的应用软件,其实从这角度讲它只是个代理,但是nginx能做的不仅仅是代理,这就是本文存在的价值。

 

3、nginx+php-fpm vs apache+mod_php

php是世界上最好的语言,这已经成为一个段子,我本身非常喜欢这个语言。这里以php为例解释下nginx的动态处理方式。首先它们都是为了处理动态请求。php是脚本语言解释器,不做处理网络请求和响应的事(虽然它可以)。nginx, apache, php-fpm 这3个都是网络服务器,处理请求和响应。mod_php是个c解释php的模块库。

 

client >---http-request--- apache(mod_php)

client <---http-response-- apache(mod_php)

 

client >---http-request--- nginx >---fastcgi-request--- php-fpm(c解释php)

client <---http-response-- nginx <---fastcgi-response-- php-fpm(c解释php)

 

为统一,我们把处理http的服务器称为web服务器,处理动态请求的称为应用服务器。所以apache是应用服务器,nginx是web服务器,它通过代理(fastcgi协议)转发给应用服务器php-fpm。服务器的设计原则是永远不能阻塞,但规则往往因为被打破而简化了问题。注意nginx与php-fpm的交互是异步的,mod_php, php-fpm里c解释php阻塞的。(不用纠结这两个词)

 

4、让nginx成为应用服务器

nginx本身有个模块ssi,全称是server side includes,它是个极小解释器,可以让响应内容有小动态的功能。ssi使用和原理test.html的文件内容,很像脚本语言吧,从这角度讲nginx已经是应用服务器。

hello: < !--# echo var="request_url" -->

脚本动态语言如此之多,php, perl, python, ruby, js, lua, blala 语法各异,粉丝从多,据说上帝为了不让巴别塔造成才搞了这么多不一样的东西,虽然他们目标是做同一件事,让事情变得更简单。实现应用服务器的方案也不在少数,都非常优秀。在上面我们清楚,现在的应用服务器干了两件,处理网络服务和执行业务脚本。网络服务本身是基于协议的,比如http,这个只要保证稳定性,高性能和健壮性即可。在执行业务脚本方面就区别大了。但大体有两种方法,网络处理和业务脚本是同个语言,比如nodejs, go等。这其实是有好处的,业务脚本可以获取网络服务的上下文。还有一种是分开的,根据语言有不同的系统,比如c+dsl系列的nginx + lua。那么问题来了,选择哪一个呢?稳定性,高性能和健壮。nginx本身在网络方面已经具备这3个要素了,这是我们选择它的原因。至于为什么选择lua,是因为这语言本身设计是为了让c写起来更轻松。所以我们选择一个东西时,它的出发点是什么很有参考价值。正如php为web而生一样。所以现在剩下的问题就是nginx如何执行lua。

 

5、我们不仅关注优秀的openresty,还有更多

openresty的作者可能是目前世界上在nginx的第三方模块的贡献者,除了openresty这个开源产品,还有其它优秀的模块。openresty是一个在nginx上扩展lua的应用服务器。它的官网和github上的资料非常完善,但文本的价值在于探讨如何让nginx具备应用能力。所以你不用担心是否懂openresty。我们让你明白lua是如何被加到nginx的。

 

6、lua与nginx的架构设计

nginx架构图(来源http://www.aosabook.org/en/nginx.html)

 

 

lua是个脚本语言,有着简洁的语法,虽然我不觉得非常易用。官方定义了语言规则和源码实现,目前稳定版是5.3。还有个luajit,这是非官方的实现,支持5.1的语法(openresty是用luajit的)。本文基于官方lua5.3版本。

 

---- worker process ----

nginx ---- worker process ----

---- process request 创建lua_newthread、加载请求对应文件、解释执行 ----

---- worker process ua_newstate-------- process request ----

---- process request ----

---- worker process ----

 

nginx有多个工作进程,每个worker process启动时会加载一个lua_State,然后等待请求进来,多个请求是允许同时存在的,比如有的忙着去请求远程服务,这时就异步挂着休息。当有请求过来需要处理时,nginx为每个请求创建一个lua_newthread,这个lua_newthread将加载文件、解释执行等操作。

因此你要做的就是

在init:

conf->L = lua_newstate(); // L是lua_State结构体

 

在handler:

L = conf->L;

NL = lua_newthread(L); // NL也是lua_State结构体

r->ctx->NL = NL;

luaL_loadfile(NL);

 

你可能猜到了吧,lua_newstate是个虚拟机,专门给nginx进程的,每个进程一个。lua_newthread是给请求的,每个请求也有一个,他们都具备运行lua文件的能力。但由于请求是变化的,上下文不一样,所以才需要为每个请求创建一个lua_State结构体。我们将分析lua的内部,让你更明白这个架构。

 

未完待续,写到这发现可以探讨的空间很大,lua的协程、虚拟机、全局变量和闭包(绝对有料,比如lua没有全局变量,那是为什么呢)、nginx调用了lua的哪些功能、为什么openresty写道lua的全局变量不能使用,c与lua的协作,如何让lua去调其它服务(memcache, redis, mongodb, mysql)。

  

分享到:
评论

相关推荐

    openresty(nginx-lua-module-zh-wiki)中文文档.pdf

    OpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,更主要的是在性能方面,OpenResty可以 快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web ...

    lua-nginx-redis-master.zip

    Redis、Lua、Nginx、OpenResty开发、Lua案例、Nginx模块学习以及性能优化、PHP7性能优化以及详细配置总结等。

    使用Lua编写Nginx服务器的认证模块的方法

    主要介绍了使用Lua编写Nginx服务器的认证模块的方法,即诸如当今流行的社交应用接入等功能,需要的朋友可以参考下

    玩转Nginx之:使用Lua扩展Nginx功能

    其流行度越来越高,应用也越来越广泛,常见的应用有:网页服务器、反向代理服务器以及电子邮件(IMAP/POP3)代理服务器,高并发大流量站点常用来做接入层的负载均衡,还有非常常见的用法是作为日志采集服务器等。...

    深入理解Nginx:模块开发与架构解析.陶辉(带详细书签)

    这也成就了Nginx这方面的巨作——覆盖了Nginx的安装、配置、模块开发、架构解析和深度应用等各个方面,适合不同层次的读者,并能切实地帮助读者有效地解决Nginx应用中所碰到的困惑与难题。 —— 朱少民 同济大学...

    Web应用服务器 OpenResty.zip

    通过众多进行良好设计的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 Lua 编程语言对 Nginx 核心以及现有的各种 Nginx C 模块进行脚本编程,构建出可以...

    ngx_lua 在又拍云的应用:日志收集及其他 - 又拍云系统开发工程师 - 张聪

    UPYUN 的 CDN 大量使用了 NGINX 作为反向代理服务器,并开发了一系列例如流量统计、缓存调度、防盗链等相关的 C 模块,但从 2013 年开始由于业务场景的复杂化,使得用 C 模块来写这些业务逻辑有点力不从心了,对于小...

    LuaWeb:一个非常简单的博客引擎,使用 openresty、nginx、lua、markdown、git 和 redis

    这个项目最不寻常的部分是它使用 nginx 作为“应用服务器”。 这可以使用 lua 实现,因为有一个 nginx lua 模块可以让您从 nginx conf 调用 lua。 查看,了解更多关于它可以让你做什么的信息。 Lua 最酷的地方之一...

    ngx-http-cas-client-lua:使用CAS集成支持构建Nginx

    这是一个完全使用nginx的lua模块编写的CAS客户端。 这个想法是,您将通过CAS身份验证来保护Nginx位置。 通过提供一个CAS端点(目前在nginx.conf中必须具有一个相应的条目,请参阅“限制”部分),您将能够将访问...

    Nginx利用Lua+Redis实现动态封禁IP的方法

    本文给大家介绍的是Nginx利用Lua+Redis实现动态封禁IP的方法,下面话不多说了,来一起看看详细的介绍吧 二、架构 实现 IP 黑名单的功能有很多途径: 1、在操作系统层面,配置 iptables,拒绝指定 IP 的网络请求; 2...

    Openresty_For_Windows_1.7.10.zip

    OpenResty 是一个通过扩展 nginx 的快速 Web 应用服务器。 Nginx Openresty For Windows (NOW) 是带有 Openresty 的 Windows 版本中的 Nginx。 它有一些特点: 高性能 并发两万多个连接 多进程 支持共享内存 支持...

    OpenResty开发最佳实践pdf

    通过揉和众多设计良好的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 Lua 编程语言对 Nginx 核心以及现有的各种 Nginx C 模块进行脚本编程,构建出可以...

    OpenResty最佳实践

    通过揉和众多设计良好的 nginx 模块,OpenResty 有效地把 nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 lua 编程语言对 nginx 核心以及现有的各种 nginx C 模块进行脚本编程,构建出可以...

    Nginx模块开发指南:使用C++11和Boost程序库.mobi

    自 2004 年 正式 发布 以来, Nginx 已经 拥有 了 百余 个 官方 及 非官方 的 功能 模块( 如 fastcgi、 memcache、 mysql、 lua 等), 这 使得 Nginx 超越 了 一般 意义上 的 Web 服务器, 成为 了 一个 近乎“ ...

    一个快速和健壮的web服务器和应用服务器,支持c++,Python,Lua,Java, PHP7,Javascript和多种jsr-223 JVM语言- webcpp/hi-nginx

    FeaturesAll features of nginx(latest release) are inherited, i.e., it is 100% compatible with nginx.Web development using python, c++, lua, php7, java , javascript and jsr-223 JVM ...

    lusty:Lua RESTful Web应用程序框架

    是nginx + lua,并且是当前受支持的服务器。 Apache和IIS将在更高版本中发布。 我们还建议您安装lusty_admin,这将帮助您运行开发服务器和引导应用程序。 luarocks install lusty\_admin将帮助您入门。 然后,您...

    Lua的MVC框架Sailor.zip

    支持跨平台,兼容 mod_lua 或者 mod_pLua, Nginx 的 ngx_lua, 或者任何支持 CGI 的 Web 服务器,如 Civetweb 或者 Mongoose, 前提是必须有 CGILua使用 Sailor 开发应用的目录结构如下:/conf - 存放配置文件/...

    openresty最佳实践

    OpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,更主要的是在性能方面,OpenResty可以 快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web ...

Global site tag (gtag.js) - Google Analytics