`
chaoslawful
  • 浏览: 196318 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

ngx_lua模块进行web开发的常见问题解答

阅读更多
[list]
  • 如何获取HTTP请求头?




  • 直接在 ngx_lua 中访问 NginX 内置变量 ngx.var.http_HEADER 即可获得请求头 HEADER 的内容。对于常见的特殊头(Content-Type、Cookie 等),NginX 还使用了特殊的变量来独立保存,例如“Content-Type”头可以通过 ngx.var.content_type 变量取得。


  • 如何获取GET参数?




  • 在 ngx_lua 中访问 NginX 内置变量 ngx.var.arg_PARAMETER 即可获得GET参数PARAMETER的内容。


  • 如何获取POST请求体数据?




  • 要获得完整的POST请求体数据,可以访问 NginX 内置变量 ngx.var.request_body(注意:由于 NginX 默认在处理请求前不自动读取 request body,所以目前必须显式借助 form-input-nginx 模块才能从该变量得到请求体,否则该变量内容始终为空!)。如果想获取 POST 方式提交的表单参数,还可以借助 form-input-nginx 模块省去解析过程。例如:

    location /form {
        set_form_input $name;
        content_by_lua '
            local name = ngx.var.name or "";
            local say = ngx.say
            say("My name is: ", name)
        ';
    }
    

  • 如何设置/获取HTTP响应头?




  • 我们已经设计了对应的API接口,近期即会予以实现。

  • 如何使用 Lua 外部模块?

  • 通过 require 引用即可,和在普通的 Lua 代码里一样。需要注意的一点是,通过 require 引用外部模块一般有 2 种写法。老的写法是:

    require("xxx")
    


    这样会将模块命名空间表直接导入当前全局环境内;而新的写法是:

    local xxx = require("xxx")
    


    这样的写法将模块命名空间表缓存在同名局部变量中,访问更快,也不会污染当前全局环境。但最重要的一点是:老的写法在 ngx_lua 中会出现模块导入后无法访问的现象!这是由 ngx_lua 实现原理决定的。ngx_lua 使用每请求一个 coroutine 的方式运行用户代码,coroutine 的全局环境是重新关联的,因此用户代码相当于运行在一个沙盒中,请求处理结束后用户代码产生的所有全局环境修改都会被舍弃,避免多个请求之间产生交叉影响,也降低了因滥用全局环境产生内存泄漏的风险。而 require 利用了全局共享的 package.loaded 表缓存已载入模块的数据,以达到避免重复加载模块的目的。很明显,这种结构必然会使首个请求中通过 require 注入全局环境的模块命名空间表在后续请求中无法访问,因为后续请求中 package.loaded 表内已经有之前加载模块的数据,故 require 不会再次将命名空间表注入当前全局环境,使得以后所有依赖于模块的操作都失败。

    鉴于这一问题,我们推荐开发人员总是使用新的 require 写法(即使用局部变量缓存模块表),对于那些因为某种原因无法更新 require 写法的代码,可以通过在开始处理请求前清空 package.loaded 表中对应模块数据的方式强制加载模块并注入全局环境(注意每次都加载模块可能产生性能瓶颈!),例如:

    package.loaded.xxx = nil
    require("xxx")
    


    [/list]

    参考:

    1. http://wiki.nginx.org/NginxHttpCoreModule#Variables
    2. http://github.com/calio/form-input-nginx-module


    1
    0
    分享到:
    评论
    1 楼 liuxuejin 2012-11-13  
    整理得不错

    相关推荐

      ngx_lua_module-windows-1.1.2.0

      nginx lua module for windows 详细请访问 http://blog.csdn.net/ngwsx/

      lua-resty-websocket, 对ngx_lua模块( 和 OpenResty )的web socket支持.zip

      lua-resty-websocket, 对ngx_lua模块( 和 OpenResty )的web socket支持 电子邮件名称lua-resty-websocket - ngx_lua模块的Lua web socket实现 table-内容名称状态描述概要说明模块resty.websocket.server方法新插件...

      nginx+lua简要说明

      lua模块,并且将Nginx核心、LuaJIT、ngx_lua模块、许多有用的Lua库和常用的第三方Nginx模块组合在一起成为OpenResty,这样开发人员就可以安装OpenResty,使用Lua编写脚本,然后部署到Nginx Web容器中运行。...

      ngx_mruby:ngx_mruby-使用脚本语言mruby for nginx的快速且高效内存的Web服务器扩展机制

      ngx_mruby将提供lua-nginx-module或的替代方案。 Apache(mod_mruby),nginx(ngx_mruby)和其他Web服务器软件(计划)之间的统一Ruby代码,用于Web服务器扩展。 您可以通过nginx上的Ruby脚本来实现nginx模块! 您...

      Openresty_For_Windows_1.7.10.zip

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

      淘宝网Nginx应用、定制与开发实战.pdf[书签版]

      警告:本资源教程仅用于技术交流、学习。下载阅读后请自行删除,一切涉及版权、商务因素引起的纠纷由...ngx_lua + ngx_drizzle应用案例 5、当前工作 即将发布的功能 正在开发中的功能 关于Tengine的后续发展 参考资源

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

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

      Linux下给nginx安装waf模块

      ngx_lua_waf是一个基于ngx_lua的web应用防火墙。代码很简单,开发初衷主要是使用简单,高性能和轻量级。下面我们来看看如何在为nginx安装waf模块

      OpenResty开发最佳实践pdf

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

      openresty最佳实践

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

      OpenResty最佳实践

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

      nginx_lua_framework:Siva 是一个(非常)简单且轻量级的基于 ngx-openresty 的 Web 框架

      打造高性能Web平台Nginx定制开发实战-Siva由 Lua 粘合的 Nginx 生态环境AJAX 化和 Service 化的趋势让所有东西开始讲 –RESTful天下武功,无坚不破,唯快不破!Nginx的看家本领就是速度,Lua的拿手好戏亦是速度,这...

      OpenResty(又称:ngx-openresty) 基于 NGINX 的可伸缩的 Web 平台

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

      Web应用服务器 OpenResty.zip

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

      mod_mruby:mod_mruby

      Apache(mod_mruby),nginx(ngx_mruby)和其他Web服务器软件(计划)之间的统一Ruby代码,用于Web服务器扩展。 您可以通过Ruby在Apache httpd上实现Apache模块。 您可以通过相同的Ruby代码实现某些Web服务器软件...

      OpenResty可伸缩的Web平台 v1.19.3.1

      OpenResty(也称为 ngx_openresty)是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态...

      OpenResty可伸缩的Web平台-其他

      这样,Web开发人员和系统工程师可以使用Lua脚本语言调动Nginx支持的各种C以及Lua模块,快速构造出足以胜任10K乃至1000K以上单机并发连接的高性能Web应用系统。 OpenResty的目标是让你的Web服务直接跑在Nginx服务内部...

      网站安全狗Linux-Nginx版(32位)v2.4.2.gz

      安全狗linux版是为Linux服务器开发的一款服务器管理软件,全面支持apache和nginx防护。具有DDOS攻击防护、CC攻击防护、Ftp/SSH防暴力破解、SSH远程登录保护、网站漏洞防护、url地址全检测、防盗链、网站特定资源保护...

      Openresty服务器使用lua脚本写的Hello World简单实例

      主要介绍了Openresty服务器使用lua脚本写的Hello World简单实例,OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项,...

    Global site tag (gtag.js) - Google Analytics