一,模块化开发
在实际开发中,不可能把所有代码写到一个大而全的lua文件中,需要进行分模块开发;而且模块化是高性能Lua应用的关键。使用require第一次导入模块后,所有Nginx进程全局共享模块的数据和代码,每个Worker进程需要时会得到此模块的一个副本(Copy-On-Write),即模块可以认为是每Worker进程共享而不是每Nginx Server共享;另外注意之前我们使用init_by_lua中初始化的全局变量是每请求复制一个;如果想在多个Worker进程间共享数据可以使用 ngx.shared.DICT或如Redis之类的存储。
在上一章节example项目中的lualib目录下,我们已经引入了很多第三方lua模块(类似于java中的jar包),如果需要用到某个模块的功能,只需要使用require命令导入该模块即可使用(类似于java中的import命令)。
#导入json处理模块 local cjson = require(“cjson”); #导入redis客户端api模块 local redis = require(“resty.redis”);//在lua_package_path和lua_package_cpath声明的的位置查找这些引入的模块
二,自定义模块
#在/usr/local/nginx/webapps/example/lualib/目录下新建module目录,用户存放自定义模块 cd /usr/local/nginx/webapps/example/lualib/ mkdir module #在module目录新建demo.lua模块文件 touch demo.lua在demo.lua中编辑自定义代码(类似于java中的demo.java文件):
local count = 0 local function getCount() count = count + 1 ngx.say("count : ", count) end local _M = { getCount = getCount } return _M在开发时将所有数据做成局部变量/局部函数;通过 _M导出要暴露的函数,实现功能模块化封装。 三,测试自定义模块
#在/usr/local/nginx/webapps/example/lua/目录新建test-module-demo.lua文件 touch test-module-demo.lua #编辑test-module-demo.lua文件(类似于java中的main方法) local moduleDemo = require("module.demo"); moduleDemo.getCount(); #修改example.conf配置文件,新增如下配置 location /example/test-module-demo { default_type 'text/html'; lua_code_cache on; content_by_lua_file webapps/example/lua/test-module-demo.lua; } #重启nginx /usr/local/nginx/sbin/nginx -s reload在浏览器地址栏输入http://120.25.233.113:802/example/test-module-demo 验证结果: