`
jinnianshilongnian
  • 浏览: 21504101 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2418690
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:3008797
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5639491
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:259916
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1597327
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:250222
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5858965
Group-logo
跟我学Nginx+Lua开...
浏览量:702008
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:785224
社区版块
存档分类
最新评论

第四章 Lua模块开发

阅读更多

在实际开发中,不可能把所有代码写到一个大而全的lua文件中,需要进行分模块开发;而且模块化是高性能Lua应用的关键。使用require第一次导入模块后,所有Nginx 进程全局共享模块的数据和代码,每个Worker进程需要时会得到此模块的一个副本(Copy-On-Write),即模块可以认为是每Worker进程共享而不是每Nginx Server共享;另外注意之前我们使用init_by_lua中初始化的全局变量是每请求复制一个;如果想在多个Worker进程间共享数据可以使用ngx.shared.DICT或如Redis之类的存储。

 

在/usr/example/lualib中已经提供了大量第三方开发库如cjson、redis客户端、mysql客户端:

cjson.so

resty/

   aes.lua

   core.lua

   dns/

   lock.lua

   lrucache/

   lrucache.lua

   md5.lua

   memcached.lua

   mysql.lua

   random.lua

   redis.lua

   ……

 

 

需要注意在使用前需要将库在nginx.conf中导入:

    #lua模块路径,其中”;;”表示默认搜索路径,默认到/usr/servers/nginx下找
    lua_package_path "/usr/example/lualib/?.lua;;";  #lua 模块
    lua_package_cpath "/usr/example/lualib/?.so;;";  #c模块 

使用方式是在lua中通过如下方式引入

local cjson = require(“cjson”)
local redis = require(“resty.redis”) 

接下来我们来开发一个简单的lua模块。

vim /usr/example/lualib/module1.lua
local count = 0
local function hello()
   count = count + 1
   ngx.say("count : ", count)
end

local _M = {
   hello = hello
}

return _M

开发时将所有数据做成局部变量/局部函数;通过 _M导出要暴露的函数,实现模块化封装。

 

接下来创建test_module_1.lua

vim /usr/example/lua/test_module_1.lua
local module1 = require("module1")

module1.hello()

 使用 local var = require("模块名"),该模块会到lua_package_path和lua_package_cpath声明的的位置查找我们的模块,对于多级目录的使用require("目录1.目录2.模块名")加载。

 

example.conf配置

    location /lua_module_1 {
        default_type 'text/html';
        lua_code_cache on;
        content_by_lua_file /usr/example/lua/test_module_1.lua;
    }

 

访问如http://192.168.1.2/lua_module_1进行测试,会得到类似如下的数据,count会递增

count : 1

count :2

……

count :N

 

此时可能发现count一直递增,假设我们的worker_processes  2,我们可以通过kill -9 nginx worker process杀死其中一个Worker进程得到count数据变化。

 

 

假设我们创建了vim /usr/example/lualib/test/module2.lua模块,可以通过local module2 = require("test.module2")加载模块

 

基本的模块开发就完成了,如果是只读数据可以通过模块中声明local变量存储;如果想在每Worker进程共享,请考虑竞争;如果要在多个Worker进程间共享请考虑使用ngx.shared.DICT或如Redis存储。

 

 

4
3
分享到:
评论
6 楼 javaDog_li 2018-07-11  
kang19870415 写道
这一章内容我尝试了无数遍也没有成功,后来将模块包中mysql.lua,改成sql.lua也没成功,但直接加入mysql.lua就成功。
这内容是不是少了什么步骤?


如果是导lua package ,有问题, 看看是不是 把导包语句写到了http 里,我开始写到了nginx.conf 头部 是不行的
5 楼 main616 2016-09-12  
main616 写道
假设我们的worker_processes  2,
我们可以通过kill -9 nginx worker process杀死其中一个Worker进程得到count数据变化。


after kill a processor
nginx start a new processor


assume 2 worker_processor workerA & workerB
after curl localhost:8080
workerA process load the lua
do curl again
now count=2

==================kill workerA you will get count=1 ,reload lua
=> the log
2016/09/12 23:40:47 [notice] 9583#0: start worker processes
2016/09/12 23:40:47 [notice] 9583#0: start worker process 9584
2016/09/12 23:40:47 [notice] 9583#0: start worker process 9585
2016/09/12 23:41:00 [debug] 9584#0: *1 [lua] a_module.lua:2: ======start loading======
2016/09/12 23:41:00 [debug] 9584#0: *1 [lua] a_module.lua:5: hello(): count=1
2016/09/12 23:41:00 [info] 9584#0: *1 client 127.0.0.1 closed keepalive connection
2016/09/12 23:41:05 [debug] 9584#0: *2 [lua] a_module.lua:5: hello(): count=2
2016/09/12 23:41:05 [info] 9584#0: *2 client 127.0.0.1 closed keepalive connection
2016/09/12 23:41:30 [notice] 9583#0: signal 17 (SIGCHLD) received
2016/09/12 23:41:30 [alert] 9583#0: worker process 9584 exited on signal 9
2016/09/12 23:41:30 [notice] 9583#0: start worker process 9607
2016/09/12 23:41:30 [notice] 9583#0: signal 29 (SIGIO) received
2016/09/12 23:41:37 [debug] 9585#0: *3 [lua] a_module.lua:2: ======start loading======
2016/09/12 23:41:37 [debug] 9585#0: *3 [lua] a_module.lua:5: hello(): count=1
2016/09/12 23:41:37 [info] 9585#0: *3 client 127.0.0.1 closed keepalive connection

==================kill workerB you will get count=3 ,not reload
=> the log
2016/09/12 23:43:19 [notice] 9676#0: start worker processes
2016/09/12 23:43:19 [notice] 9676#0: start worker process 9677
2016/09/12 23:43:19 [notice] 9676#0: start worker process 9678
2016/09/12 23:43:31 [debug] 9677#0: *1 [lua] a_module.lua:2: ======start loading======
2016/09/12 23:43:31 [debug] 9677#0: *1 [lua] a_module.lua:5: hello(): count=1
2016/09/12 23:43:31 [info] 9677#0: *1 client 127.0.0.1 closed keepalive connection
2016/09/12 23:43:44 [debug] 9677#0: *2 [lua] a_module.lua:5: hello(): count=2
2016/09/12 23:43:44 [info] 9677#0: *2 client 127.0.0.1 closed keepalive connection
2016/09/12 23:44:02 [notice] 9676#0: signal 17 (SIGCHLD) received
2016/09/12 23:44:02 [alert] 9676#0: worker process 9678 exited on signal 9
2016/09/12 23:44:02 [notice] 9676#0: start worker process 9701
2016/09/12 23:44:02 [notice] 9676#0: signal 29 (SIGIO) received
2016/09/12 23:44:05 [debug] 9677#0: *3 [lua] a_module.lua:5: hello(): count=3
2016/09/12 23:44:05 [info] 9677#0: *3 client 127.0.0.1 closed keepalive connection


file a_module.lua
local count = 0
ngx.log(ngx.DEBUG, "======start loading======")
local function hello()
count = count + 1
ngx.log(ngx.DEBUG, "count="..count)
ngx.say("count:",count)
end

local _M = {
hello = hello
}

return _M

file hello.lua
local a_module = require('a_module')
a_module.hello()

conf/nginx.conf
location / {
      default_type          text/html;
      content_by_lua_file   lua/hello.lua;
    }
4 楼 main616 2016-09-12  
假设我们的worker_processes  2,
我们可以通过kill -9 nginx worker process杀死其中一个Worker进程得到count数据变化。


after kill a processor
nginx start a new processor


assume 2 worker_processor workerA & workerB
after curl localhost:8080
workerA process load the lua
do curl again
now count=2

==================kill workerA you will get count=1 ,reload lua
=> the log
2016/09/12 23:40:47 [notice] 9583#0: start worker processes
2016/09/12 23:40:47 [notice] 9583#0: start worker process 9584
2016/09/12 23:40:47 [notice] 9583#0: start worker process 9585
2016/09/12 23:41:00 [debug] 9584#0: *1 [lua] a_module.lua:2: ======start loading======
2016/09/12 23:41:00 [debug] 9584#0: *1 [lua] a_module.lua:5: hello(): count=1
2016/09/12 23:41:00 [info] 9584#0: *1 client 127.0.0.1 closed keepalive connection
2016/09/12 23:41:05 [debug] 9584#0: *2 [lua] a_module.lua:5: hello(): count=2
2016/09/12 23:41:05 [info] 9584#0: *2 client 127.0.0.1 closed keepalive connection
2016/09/12 23:41:30 [notice] 9583#0: signal 17 (SIGCHLD) received
2016/09/12 23:41:30 [alert] 9583#0: worker process 9584 exited on signal 9
2016/09/12 23:41:30 [notice] 9583#0: start worker process 9607
2016/09/12 23:41:30 [notice] 9583#0: signal 29 (SIGIO) received
2016/09/12 23:41:37 [debug] 9585#0: *3 [lua] a_module.lua:2: ======start loading======
2016/09/12 23:41:37 [debug] 9585#0: *3 [lua] a_module.lua:5: hello(): count=1
2016/09/12 23:41:37 [info] 9585#0: *3 client 127.0.0.1 closed keepalive connection

==================kill workerB you will get count=3 ,not reload
=> the log
2016/09/12 23:43:19 [notice] 9676#0: start worker processes
2016/09/12 23:43:19 [notice] 9676#0: start worker process 9677
2016/09/12 23:43:19 [notice] 9676#0: start worker process 9678
2016/09/12 23:43:31 [debug] 9677#0: *1 [lua] a_module.lua:2: ======start loading======
2016/09/12 23:43:31 [debug] 9677#0: *1 [lua] a_module.lua:5: hello(): count=1
2016/09/12 23:43:31 [info] 9677#0: *1 client 127.0.0.1 closed keepalive connection
2016/09/12 23:43:44 [debug] 9677#0: *2 [lua] a_module.lua:5: hello(): count=2
2016/09/12 23:43:44 [info] 9677#0: *2 client 127.0.0.1 closed keepalive connection
2016/09/12 23:44:02 [notice] 9676#0: signal 17 (SIGCHLD) received
2016/09/12 23:44:02 [alert] 9676#0: worker process 9678 exited on signal 9
2016/09/12 23:44:02 [notice] 9676#0: start worker process 9701
2016/09/12 23:44:02 [notice] 9676#0: signal 29 (SIGIO) received
2016/09/12 23:44:05 [debug] 9677#0: *3 [lua] a_module.lua:5: hello(): count=3
2016/09/12 23:44:05 [info] 9677#0: *3 client 127.0.0.1 closed keepalive connection
3 楼 漫听风月 2016-03-25  
访问如http://192.168.1.2/lua_module_1进行测试,会得到类似如下的数据,count会递增
这个不会递增吧,一直是1
2 楼 newboy2004 2015-12-20  
    location /lua_module_1 {
        default_type 'text/html';
        lua_code_cache on;
        content_by_lua_file /usr/example/lua/test_module_1.lua;
    }

导入这个重新reload  nginx  无法访问
1 楼 kang19870415 2015-10-20  
这一章内容我尝试了无数遍也没有成功,后来将模块包中mysql.lua,改成sql.lua也没成功,但直接加入mysql.lua就成功。
这内容是不是少了什么步骤?

相关推荐

    第一章 安装OpenResty(Nginx+Lua)开发环境

    例如,Lua的 ngx_lua 模块提供了一系列API,如 ngx.say() 用于输出内容,ngx.req.get_uri_args() 用于获取请求参数。通过这些API,你可以在Nginx的HTTP请求处理阶段执行复杂的逻辑。 总之,安装OpenResty需要理解...

    Lua 开发环境+教程

    Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器配置等领域。它的设计目标是小巧高效,语法简洁明了,易于学习和集成到其他系统中。以下是一些关于Lua开发环境和教程的相关知识点: 1. **Lua语法...

    nginx,lua模块安装

    1. **Nginx与Lua模块** Nginx是一个高性能的HTTP和反向代理服务器,常用于网站的负载均衡和静态资源处理。Lua模块是Nginx的一个扩展,允许在Nginx配置文件中嵌入Lua脚本,提供了更灵活的服务器配置和动态处理能力。...

    lua程序设计第二版+第四版

    标题提及的"lua程序设计第二版+第四版"涵盖了该语言的重要学习资源,包括中文版的第二版和英文版的第四版。这两本书都是学习Lua编程的宝贵资料,提供了全面的教程和深入的指南。 《Lua程序设计(第二版)》中文版是...

    Programming In Lua 中文版PDF高清

    **第4章 基本语法** - **简述**:覆盖了Lua的基本语法规则,例如变量声明、流程控制语句等。 - **知识点**: - 变量声明和赋值。 - 控制流语句(if、while、for等)。 - 注释的使用。 **第5章 函数** - **简述**...

    Lua程序设计,2~4版本pdf电子书,C的Lua语言原滋原味

    "Lua程序设计,2~4版本pdf电子书"涵盖了从第二版到第四版的Lua语言核心概念和技术,这是一份宝贵的资源,尤其对于那些想要深入理解Lua的开发者来说。 第一部分:Lua语言基础 Lua的核心语法简洁明了,易于学习。从第...

    跟我学Nginx + Lua开发

    OpenResty是基于Nginx与LuaJIT的一个高性能Web平台,它以标准Nginx核心,集成了大量的精心设计的Nginx模块,主要包括:ngxLua模块、MySQL模块、Redis模块、Memcached模块等。这些模块使得开发者能够在Nginx内直接...

    lua编程第四版英文版

    4. **模块系统**:Lua没有内置的模块系统,但可以通过自定义的加载机制实现模块化编程,提高代码复用性和可维护性。 5. **垃圾回收**:Lua的垃圾回收机制基于引用计数和弱引用,自动管理内存,开发者无需显式地分配...

    跟我学Nginx+Lua开发.pdf

    - **第四章**(未提及): 可能涵盖更高级的主题,例如性能调优或最佳实践。 - **第五章**: 常用Lua开发库3-模板渲染。介绍常用的Lua开发库以及如何使用它们进行模板渲染。 - **第六章**: Web开发实战1——HTTP服务。...

    Lua程序设计第三版第四版英文版

    《Lua程序设计》是学习和掌握Lua语言的重要参考资料,尤其对于第三版和第四版这样的更新版本,通常会包含更多的实践案例和语言新特性。 第三版和第四版的差异可能主要体现在对Lua语言的新特性和最佳实践的涵盖上。...

    lua-devel-5.3.4-12.el8.aarch64

    首先,版本号 `5.3.4` 表示这是 Lua 5.3 系列的第四个维护版本,它包含了一些性能优化、错误修复和新功能。对于开发者来说,这意味着他们可以利用 Lua 5.3 版本引入的特性,如元表的改进、协程的增强以及更强大的...

    LUA扩展支持库

    Lua是一种轻量级的脚本语言,常用于游戏开发、嵌入式系统和服务器配置等领域。"LUA扩展支持库" 提供了对Lua功能的增强,使得开发者能够利用更丰富的功能来编写复杂的逻辑和应用。这个压缩包“lua扩展支持库静态版...

    nginx实战-基于lua语言

    1. **Nginx模块 ngx_lua**:Nginx与Lua的桥梁是ngx_lua模块,由OpenResty公司开发,它允许我们在Nginx配置文件中直接嵌入Lua脚本,实现动态处理请求。 2. **性能优势**:由于LuaJIT(Just-In-Time编译器)的存在,...

    Nginx添加Lua扩展模块.rar

    Lua模块,即ngx_lua,是Nginx的一个第三方模块,它允许我们在Nginx配置文件中直接嵌入Lua代码,或者在处理请求时运行Lua脚本。 安装ngx_lua模块,通常需要以下步骤: 1. **下载OpenResty**: OpenResty是一个集成了...

    windows环境安装lua

    1. **下载Lua**:首先,你需要访问Lua的官方网站(<http://www.lua.org>)或第三方资源网站,下载适合Windows系统的Lua 5.1.5版本的安装包。通常,你会找到一个名为`lua-5.1.5-win32.zip`或类似名称的压缩文件。 2....

    ngx_lua_module-windows-1.1.2.0

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

    Lua程序设计.pdf_lua_nginx_

    OpenResty提供了ngx_lua模块,允许我们在Nginx服务器端直接运行Lua脚本,实现高性能的动态内容生成和处理。这包括但不限于动态路由、会话管理、API网关、限流策略等。通过Lua,开发者可以编写灵活且高效的服务器逻辑...

    lua api lua文档

    - **CPackages**:用于描述C语言编写的Lua模块。 - **错误**:程序运行过程中可能出现的问题。 - **异常和错误处理**:如何处理运行时错误。 - **错误信息和回跟踪**:如何生成和解析错误信息。 #### 九、协同程序 ...

    lua资源5.14.lua.exe

    2. **库和模块**:预编译或源码形式的第三方扩展,增加了Lua的功能,比如网络通信、图形处理等。 3. **开发文档**:包括Lua语言的官方参考手册、编程指南,以及可能的特定于版本的说明。 4. **工具**:例如Lua的IDE...

    lua 帮助文档 lua

    由于其简洁的语法和高效的执行,Lua在游戏开发、网络编程、系统配置、数据库接口等多个领域都有广泛的应用。 在Lua的帮助文档中,我们可以找到关于该语言的核心概念、语法特性、数据类型、控制结构、函数、模块系统...

Global site tag (gtag.js) - Google Analytics