《用OpenResty搭建高性能服务端》笔记 (2)

知识点:
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块加上:

lua_code_cache off; location /hello { default_type text/html; content_by_lua_file conf/lua/hello.lua; }

然后重启:

$ ./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

-- 实现随机字符串 local args = ngx.req.get_uri_args() local salt = args.salt if not salt then ngx.exit(ngx.HTTP_BAD_REQUEST) end local str = ngx.md5(ngx.time() .. salt) ngx.say(str)

修改 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里面:

《用OpenResty搭建高性能服务端》笔记

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所在的位置:

《用OpenResty搭建高性能服务端》笔记

下面,我们使用 ngx_lua完成另外一个小功能:实现base64的解码并重新json编码输出。代码里会用到一些指令和API。

lua代码:
nginx/conf/lua/decode_info.lua

-- 实现base64的解码并重新json编码输出 local json = require "cjson" ngx.req.read_body() local args = ngx.req.get_post_args() if not args or not args.info then ngx.exit(ngx.HTTP_BAD_REQUEST) end local client_ip = ngx.var.remote_var or '127.0.0.1' local user_agnet = ngx.req.get_headers()['user_agent'] or '' local info = ngx.decode_base64(args.info) local res = {} res.client_ip = client_ip res.user_agnet = user_agnet res.info = info ngx.say(json.encode(res))

修改 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"}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwzwd.html