OpenResty的简单使用

319 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

OpenResty的简单使用

简介

通过 Lua 扩展 NGINX 实现的可伸缩的 Web 平台, 中文网站

快速开始

下载 下载地址 具体步骤参考官方文档, 这里我们为了方便直接下载Windows版本的zip包 解压后目录如下, 因为是基于nginx的扩展, 可以看到关于nginx的相关文件

image.png

我们将官网上的例子复制到conf文件里的nginx.conf中, 然后双击nginx.exe启动nginx, 然后浏览器访问, 可以看到一个hello world就完成了

server {
  listen 8080;
  location / {
      default_type text/html;
      content_by_lua_block {
          ngx.say("<p>hello, world</p>")
      }
}

image.png

操作redis

下面我们参考lua-resty-redis实现nginx-lua操作redis的简单功能

添加key并设置过期时间 我们改造下参考文档上的demo, 通过http post的方式向redis中添加一些信息

location /testLuaRedisPost {
        # json格式数据
	default_type application/json;
	content_by_lua_block {
		local redis = require "resty.redis"
		-- 创建redis实例
		local red = redis:new()
                -- 设置超时时间, 1s
		red:set_timeouts(1000, 1000, 1000)
		-- 创建连接
		local ok, err = red:connect("127.0.0.1", 6379)
		if not ok then
			ngx.say("failed to connect: ", err)
			return
		end
		-- 密码登录
		local res, err = red:auth("123456")
		if not res then
			ngx.say("failed to authenticate: ", err)
			return
		end
		-- 开启body获取功能
		ngx.req.read_body()
		-- 获取body参数, 返回body字符串
		local body_string = ngx.req.get_body_data()
                -- 转json
                -- local cjson = require("cjson");
                -- local jsonStr = cjson.decode(body_string);
                -- 向redis添加key
		local ok, err = red:set("key", body_string)
		if not ok then
			ngx.say("failed to set", err)
			return
		end
		-- 设置过期时间
		local ok, err = red:expire("key", 30000)
		if not ok then
			ngx.say("failed to set expire", err)
			return
		end
		-- 添加入连接池, 连接池大小100, 最大空闲时间为10s
		local ok, err = red:set_keepalive(10000, 100)
		if not ok then
    			ngx.say("failed to set keepalive: ", err)
			return
		end
                -- 响应结果
		ngx.say("success")
	}
}

image.png

获取redis key

location /testLuaRedisGet {
	default_type application/json;
	content_by_lua_block {
		local redis = require "resty.redis"
		local red = redis:new()
		red:set_timeouts(1000, 1000, 1000)
		local ok, err = red:connect("127.0.0.1", 6379)
		if not ok then
			ngx.say("failed to connect: ", err)
			return
		end
		local res, err = red:auth("123456")
		if not res then
			ngx.say("failed to authenticate: ", err)
			return
		end
		-- 获取url携带参数
		args = ngx.req.get_uri_args()
		local res, err = red:get(args["key"])
		if not res then
			ngx.say("failed to get.", err)
			return
		end
		if res == ngx.null then
			ngx.say("get key is null.", err)
			return
		end
		local ok, err = red:set_keepalive(10000, 100)
		if not ok then
    		ngx.say("failed to set keepalive: ", err)
			return
		end
		ngx.say(res)
	}
}

image.png

其实我们可以看到上面操作redis的步骤其实是一套模板代码, 也就是这一块代码

image.png 我们可以参考OpenResty最佳实践的redis二次封装简化使用