知识点:
1、content_by_lua:返回的内容使用 lua 代码。
2、content_by_lua_file:读取lua文件里的 lua 代码。
3、默认情况下,修改Lua代码,需要 reload OpenResty服务才会生效。可以修改lua_code_cache为off,作用域: http, server, location, location if。请勿在生产环境里开启。
测试1:使用content_by_lua_file
cd /usr/local/openresty mkdir nginx/conf/lua vim nginx/conf/lua/hello.lua内容为:
ngx.say("<p>hello, lua world</p>")然后修改 nginx.conf:
location /hello { default_type text/html; content_by_lua_file conf/lua/hello.lua; }重启 OpenResty:
$ ./nginx/sbin/nginx -s reload启动成功后,查看效果:
$ curl :8080/hello <p>hello, lua world</p>测试2:关闭lua_code_cache:
根据lua_code_cache作用域,我们可以在server块加上:
然后重启:
$ ./nginx/sbin/nginx -s reload nginx: [alert] lua_code_cache is off; this will hurt performance in /usr/local/openresty/nginx/conf/nginx.conf:43提示说lua_code_cache关闭后影响性能。我们再次修改 nginx/conf/lua/hello.lua的代码,保存后就会生效,无需 reload server。
OpenResty 入门这节使用 ngx_lua api完成一个小功能。
lua代码:
nginx/conf/lua/get_random_string.lua
修改 nginx.conf ,新增:
location /get_random_string { content_by_lua_file conf/lua/get_random_string.lua; }由于修改了 nginx.conf ,需要reload OpenResty 服务。然后,我们访问服务:
$ curl :8080/get_random_string?salt=2 2d8231ff301ab0ce8b95c7e4c2c59574 $ curl :8080/get_random_string?salt=2 c145db4ec45a6bf792ac30ed4246c563说明:
1、用于获取URI请求参数。
2、为ngx常量,指的是400。代码里尽量使用常量。
3、ngx.time()用于获取时间戳,是带有缓存的。与Lua的日期库不同,不涉及系统调用。尽量使用Ngx给出的方法,以免发生性能问题。
4、ngx.md5()用于生成md5值。
5、如果代码里有语法错误,我们可以通过nginx 的 error.log里看到,默认文件是 nginx/logs/error.log。
再次提醒大家,做 OpenResty 开发,lua-nginx-module 的文档是你的首选,Lua 语言的库都是同步阻塞的,用的时候要三思。也就是说,尽量使用 ngx_lua提供的api,而不是使用 Lua 本身的。例如ngx.sleep()与 lua提供的sleep,前者不会造成阻塞,后者是会阻塞的,详见:sleep · OpenResty最佳实践 。
ngx_lua API介绍本节主要是带着大家简单的过一下常用的ngx_lua API。
ngx_lua 有60多个(Directive),140多个 (截止到2019-3-26)。
指令 是 ngx_lua 提供给Nginx调用的方法,与 Nginx自带的 location、rewrite等是一个级别的。指令有自己的作用域,例如:content_by_lua_file只能作用于location和location if里面:
API 是指ngx_lua基于lua代码实现的一系列方法或常量,遵循 lua的语法规则。只能在lua代码块或者lua文件里使用。
例如:
content_by_lua ' ngx.say("<p>hello, world</p>") ';其中content_by_lua是指令,作用于location块;ngx.say()是 ngx_lua 提供的API。
在官方文档上可以找到指令及API所在的位置:
下面,我们使用 ngx_lua完成另外一个小功能:实现base64的解码并重新json编码输出。代码里会用到一些指令和API。
lua代码:
nginx/conf/lua/decode_info.lua
修改 nginx.conf ,新增:
location /decode_info { content_by_lua_file conf/lua/decode_info.lua; }由于修改了 nginx.conf ,需要 reload OpenResty 服务。然后,我们访问服务:
$ php -r "echo base64_encode('test');" dGVzdA== $ curl -XPOST -d "info=dGVzdA==" :8080/decode_info {"user_agnet":"curl\/7.19.7","client_ip":"127.0.0.1","info":"test"}