Loading... # openresty对于lua的简单应用 ## 访问redis ### redis2-nginx-module redis2-nginx-module是一个支持 Redis 2.0 协议的 Nginx upstream 模块,它可以让 Nginx 以非阻塞方式直接防问远方的 Redis 服务,同时支持 TCP 协议和 Unix Domain Socket 模式,并且可以启用强大的 Redis 连接池功能。 https://github.com/openresty/redis2-nginx-module **test** ``` location = /foo { default_type text/html; redis2_query auth 123123; # 权限认证,若redis设置了密码 set $value 'first'; redis2_query set one $value; redis2_pass 192.168.199.161:6379; # 要调用的redis } ``` **get** ``` location = /get { default_type text/html; redis2_pass 192.168.199.161:6379; redis2_query auth 123123; set_unescape_uri $key $arg_key; # 从url参数中获取名称为key的参数值 redis2_query get $key; } ``` **set** ``` # GET /set?key=one&val=first%20value location = /set { default_type text/html; redis2_pass 192.168.199.161:6379; redis2_query auth 123123; set_unescape_uri $key $arg_key; # this requires ngx_set_misc set_unescape_uri $val $arg_val; # this requires ngx_set_misc redis2_query set $key $val; } ``` **pipeline** ``` set $value 'first'; redis2_query set one $value; redis2_query get one; redis2_query set one two; redis2_query get one; redis2_query del key1; ``` **list** ``` redis2_query lpush key1 C; redis2_query lpush key1 B; redis2_query lpush key1 A; redis2_query lrange key1 0 -1; ``` **集群** ``` upstream redis_cluster { server 192.168.199.161:6379; server 192.168.199.161:6379; } location = /redis { default_type text/html; edis2_next_upstream error timeout invalid_response; redis2_query get foo; redis2_pass redis_cluster; } ``` redis2-nginx-module是一个第三方nginx模块,调用的都是模块内置函数,灵活性比较差,真正使用时,大多不会使用这种方式。一般都会使用lua-resty-redis。 ### lua-resty-redis访问redis **常用方法** ``` local res, err = red:get("key") local res, err = red:lrange("nokey", 0, 1) ngx.say("res:",cjson.encode(res)) # 需要引入cjson ``` **创建连接** ``` red, err = redis:new() ok, err = red:connect(host, port, options_table?) ``` **timeout** ``` red:set_timeout(time) ``` **keepalive** ``` red:set_keepalive(max_idle_timeout, pool_size) ``` **close** ``` ok, err = red:close() ``` **pipeline(事务)** ``` red:init_pipeline() results, err = red:commit_pipeline() ``` **权限认证** ``` local res, err = red:auth("foobared") if not res then ngx.say("failed to authenticate: ", err) return end ``` **示例** ``` local redis = require "resty.redis" local red = redis:new() local ok,err = red:connect("127.0.0.1",6379) if not ok then ngx.say("failed to connect: ",err) return end ok,err = red:set("dog","an animal") if not ok then ngx.say("failed to set dog: ",err) return end ngx.say("set result: ",ok) local res,err = red:get("dog") if not res then ngx.say("failed to get dog: ",err) return end if res == ngx.null then ngx.say("dog not fount.") return end ngx.say("dog: ",res) ``` ## URL哈希负载均衡 有针对性的对url进行hash 定向负载到后端Nginx,提高Nginx缓存系统命中率。 ### nginx url_hash Nginx第三方模块,在转发请求时如果后端服务器宕机,会导致503错误 ### lua-resty-http **GitHub主页** https://github.com/ledgetech/lua-resty-http **安装组件** 由于是第三方库,所以需要去github下载。 **test** ``` local http = require("resty.http") local httpc = http.new() local resp, err = httpc:request_uri("http://www.sogou.com", { method = "GET", path = "/sogou?query=resty.http", headers = { ["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36" } }) if not resp then ngx.say("request error :", err) return end ngx.status = resp.status for k, v in pairs(resp.headers) do if k ~= "Transfer-Encoding" and k ~= "Connection" then ngx.header[k] = v end end ngx.say(resp.body) httpc:close() ``` nginx的http模块加入`resolver 8.8.8.8;`配置。 **lua-resty-http实现hash负载均衡** 对id参数进行hash负载 ``` local http = require("resty.http") local httpc = http.new() local hosts = {"192.168.150.111","192.168.150.112"} local item_id= ngx.var.arg_id local id_hash = ngx.crc32_long(item_id) local index = (id_hash % 2) +1 local resp, err = httpc:request_uri("http://"..hosts[index], { method = "GET", path = "/sogou?query=resty.http", headers = { ["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36" } }) if not resp then ngx.say("request error :", err) return end ngx.say(resp.body) httpc:close() ``` Last modification:June 11th, 2020 at 06:09 pm © 允许规范转载