文档章节

第四章 Lua模块开发

j
 jway
发布于 2015/05/21 16:08
字数 645
阅读 43
收藏 0

在实际开发中,不可能把所有代码写到一个大而全的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存储。

 

 

本文转载自:http://jinnianshilongnian.iteye.com/blog/2187067

j
粉丝 4
博文 55
码字总数 0
作品 0
长沙
私信 提问
Nginx+Lua架构开发目录贴

使用Nginx+Lua开发近一年的时间,学习和实践了一些Nginx+Lua开发的架构,为了让更多人使用Nginx+Lua架构开发,总结了一份基本的学习教程 目录 第一章 安装Nginx+Lua开发环境 第二章 Nginx+Lu...

群星纪元
05/24
30
0
《Cocos2d-x实战 Lua卷》上线了

感谢大家一直以来的支持! 各大商店均开始销售: 京东:http://item.jd.com/11659697.html 当当:http://product.dangdang.com/23659810.html 《Cocos2d-x实战 Lua卷》源码及样章下载地址: ...

智捷课堂
2015/03/26
211
1
如何安装nginx_lua_module模块

摘要: 本文记录如何安装ngx_lua模块 nginxluamodule是由淘宝的工程师清无(王晓哲)和春来(章亦春)所开发的nginx第三方模块,它能将lua语言嵌入到nginx配置中,从而使用lua就极大增强了nginx...

王二狗子11
2018/01/08
0
0
《Django企业开发实战》大纲-草稿

《Django企业开发实战》大纲-草稿 the5fire的技术博客2017-07-2016 阅读 在国内写技术书籍可能是件吃力不讨好的事情,弄不好还会被骂,所以大部分有能力写书的人,不想在这个上面花那么多时间...

the5fire的技术博客
2017/07/20
0
0
Nginx安装lua-nginx-module模块

Nginx安装lua-nginx-module模块 ngxluamodule 是一个nginx http模块,它把 lua 解析器内嵌到 nginx,用来解析并执行lua 语言编写的网页后台脚本 特性很牛叉,可自行百度查看,这里主要是示范...

污湖洞主
2017/05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
6
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部