`
chaoslawful
  • 浏览: 198441 次
  • 性别: 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

      ngx_lua_module是一款强大的扩展模块,专为Nginx服务器设计,允许在Nginx配置文件中直接嵌入Lua脚本,极大地增强了Nginx的功能和灵活性。这个"ngx_lua_module-windows-1.1.2.0"是该模块的一个Windows版本,适应于...

      ngx_lua资源

      ngx_lua 是一个强大的 Lua 脚本绑定模块,用于 ngx_openresty,这是一个全面的、高性能的、企业级的 Lua 开发平台,基于 Nginx。ngx_lua 允许开发者在 Nginx 的事件驱动、非阻塞 I/O 模型下编写服务器端的 Lua 应用...

      ngx_lua内幕

      ngx_lua是Nginx的一个模块,它通过Lua语言和协程机制解决了传统架构并发度低、内存开销大和开发维护困难的问题。其提供的异步非阻塞I/O访问接口使得业务逻辑的开发变得更加简洁高效。ngx_lua的设计充分发挥了Lua的轻...

      ngx_lua_waf-master.zip_lua_nearly11h_nginx_ngx_lua_waf

      ngx_lua_waf是一个基于Nginx的Web应用防火墙,其核心是利用了Nginx的ngx_lua模块,通过Lua脚本实现灵活且强大的安全防护功能。ngx_lua_waf项目名称中的“master”通常指的是该项目的主分支或最新版本。"nearly11h...

      Using ngx_lua in UPYUN 2.pdf

      根据提供的文件内容,这篇文档主要围绕在UPYUN云平台上使用ngx_lua模块与Nginx结合进行编程和配置的详细指南。下面将详细梳理这些知识点。 ### 标题知识点 - **ngx_lua**: 这是Nginx的一个模块,它允许Nginx执行Lua...

      Nginx-ngx_lua模块原理和内置函数.docx

      Nginx 是一款高性能的 HTTP 和反向代理 Web 服务器,而 ngx_lua 模块则是 Nginx 的一个强大扩展,它允许在 Nginx 中直接嵌入 Lua 脚本进行动态内容处理和请求/响应的修改。这种集成不仅提高了 Nginx 的灵活性,还极...

      Using ngx_lua in UPYUN 2.zip

      1. **ngx_lua 模块介绍**:ngx_lua 是由 OpenResty(一个基于 Nginx 的高性能 Web 开发框架)提供的,它允许在 Nginx 配置文件中直接编写 Lua 脚本,实现了 HTTP 请求的实时处理,包括请求的接收、响应的构建以及与...

      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方法新插件...

      Centos 7 64 +[nginx+ngx_lua 模块] 支持WAF防护功能

      本文将介绍如何在CentOS 7 64位系统上配置Nginx服务器,集成ngx_lua模块以支持Web应用防火墙(WAF)防护功能。Nginx是一款轻量级、高性能的Web服务器和反向代理服务器,因其高效并发处理能力而被广泛应用于各大...

      lua-nginx-module-0.10.13

      总结,Lua-Nginx-Module 0.10.13是Nginx的强大扩展,它将Lua语言的灵活性和Nginx的高性能结合起来,为Web开发提供了新的可能。通过学习和掌握lua-nginx-module,开发者可以构建出更加高效、可维护的Web服务。在实际...

      ngx_lua_php_queue, nginx lua php redis实现单业务排队系统架构.zip

      ngx_lua_php_queue是一个开源项目,它利用Nginx的lua模块、PHP以及Redis来构建一个单业务排队系统架构。这个架构旨在解决高并发场景下,确保请求按序处理,防止资源争抢,优化服务性能的问题。以下是这个系统架构的...

      lua-nginx-module-0.10.9rc7

      3. **配置Nginx**:在Nginx的配置文件中,启用lua模块并指定Lua脚本的路径。例如,使用`lua_code_cache on|off`来控制Lua代码缓存策略,用`set_by_lua_file`或`access_by_lua_file`等指令执行Lua脚本。 4. **测试与...

      Nginx服务器中使用lua获取get或post参数.docx

      在Nginx服务器中,使用lua获取get或post参数是通过ngx_lua模块来实现的。ngx_lua模块是Nginx的一个第三方模块,提供了在Nginx中使用Lua语言的能力。 首先,我们可以使用ngx.var.request_method获取当前请求的方法是...

      ngx_openresty-1.9.3.2

      ngx_openresty是一个高度集成的Nginx发行版,它包含了一个强大的动态脚本语言LuaJIT,并且集成了许多第三方模块,使得开发者能够轻松地构建高性能的Web应用和服务。ngx_openresty-1.9.3.2是该发行版的一个特定版本,...

      ngx_openresty_lua_技术交流实践

      - **故障细节分析**:学习在OpenResty开发中常见问题的排查方法和技巧。 - **调试技术**:掌握调试OpenResty Lua脚本的多种技术。 ### OpenResty周边技术 - **Vanilla/香草工具**:学习如何安装和使用火焰图生成...

      ngx_openresty-1.7.4.1.tar.gz

      ngx_openresty是一款基于Nginx的全功能Web平台,它集成了许多强大的Lua扩展模块,使得Nginx不仅能够处理静态文件和反向代理,还能执行动态脚本,实现高性能的Web应用服务器功能。在Linux环境下,安装ngx_openresty...

      nginx+lua简要说明

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

      ngx_openresty服务器安装步骤.docx

      ngx_openresty是一款基于Nginx的全功能Web平台,它集成了LuaJIT脚本语言,使得开发者能够利用Lua的高效性能来扩展Nginx的功能,构建高性能的Web服务和API后端。OpenResty的目标是提供一个完整的、端到端的解决方案,...

    Global site tag (gtag.js) - Google Analytics