OpenResty安装和redis的访问

OpenResty 是一个nginx和它的各种三方模块的一个打包而成的软件平台。最重要的一点是它将lua/luajit打包了进来,使得我们可以使用lua脚本来进行web的开发。有了lua,我们可以借助于nginx的异步非阻塞的功能,达到使用 lua 异步并发访问后端的 MySQL, PostgreSQL, Memcached, Redis等等服务。特别是特有的 ngx.location.capture_multi 功能让人印象深刻,其可以达到极大的减少浏览器的http连接数量,并且可以异步并发的访问后台 Java/PHP/Python 等等接口。OpenResty 架构的web可以轻松超越Node.js的性能,并且对后端语言没有限制,你可以使用Java/PHP/Python等等各种语言。OpenResty(nginx+lua)可以替代node.js的前端渲染的功能。

安装

1、    wget https://openresty.org/download/openresty-1.13.6.1.tar.gz

2、    yum -y install readline-devel pcre-devel openssl-devel gcc postgresql-devel

3、   ./configure --prefix=/root/software/openresty \ --with-luajit \

            --without-http_redis2_module \

            --with-http_iconv_module \

            --with-http_postgres_module

            make && make install

启动

~/software/openresty/nginx/sbin/nginx -p ~/software/openresty/nginx/ -c ~/software/openresty/nginx/conf/nginx.conf

查看

访问本地80端口会看到如下信息


运行lua脚本

修改nginx的配置文件(openresty的nginx文件夹里的conf)


nginx运行lua分为content_by_lua 和content_by_lua_file,前面是直接配置文件里面写lua脚本,后者是指定一个lua文件,加上lua_code_cache_off每次修改lua文件的时候不用重启nginx,方便调试。

这里的/lua 会映射到nginx文件下的lua文件夹下的hello.lua 文件


浏览器访问/lua这个路径的时候,将会打印 hello ngx_lua!!!

下面是基于redis连接池实现的连接redis,通过url的operation参数和key参数进行get操作或者set操作

ngx.header.content_type = "text/plain";

local request_method = ngx.var.request_method

local args = nil

if "GET" == request_method then

    args = ngx.req.get_uri_args()

elseif "POST" == request_method then

    ngx.req.read_body()

    args = ngx.req.get_post_args()

end

local operation = args["operation"]

local redisKey = args["key"]

if operation == nil then

  operation ="set"

end

if redisKey == nil then

redisKey="dog"

end

ngx.say("oprations=",operation)

ngx.say("key=",redisKey)

local redis = require "resty.redis"

local red = redis:new()

red:set_timeout(1000) -- 1 sec

local ok, err = red:connect("127.0.0.1", 6379)

if not ok then

    ngx.say("failed to connect: ", err)

    return

end

local count

count, err = red:get_reused_times()

if 0 == count then

    ok, err = red:auth("123456")

    if not ok then

        ngx.say("failed to auth: ", err)

        return

    end

elseif err then

    ngx.say("failed to get reused times: ", err)

    return

end

ok, err = red:set(redisKey, "this is a default value")

if not ok then

    ngx.say("failed to set : ", err)

    return

end

ngx.say("set result: ", ok)

ok,err=red:get(redisKey)

if not ok then

  ngx.say("faild to get ", err)

end

ngx.say("get reuslt: ",ok)

-- 连接池大小是100个,并且设置最大的空闲时间是 10 秒

local ok, err = red:set_keepalive(10000, 100)

if not ok then

    ngx.say("failed to set keepalive: ", err)

    return

end

这里解释一下 tcpsock:getreusedtimes() 方法,如果当前连接不是从内建连接池中获取的,该方法总是返回 0 ,也就是说,该连接还没有被使用过。如果连接来自连接池,那么返回值永远都是非零。所以这个方法可以用来确认当前连接是否来自池子。

对于 Redis 授权,实际上只需要建立连接后,首次认证一下,后面只需直接使用即可。换句话说,从连接池中获取的连接都是经过授权认证的,只有新创建的连接才需要进行授权认证。所以大家就看到了 count, err = red:get_reused_times() 这段代码,并有了下面 if 0 == count then 的判断逻辑。

参考:http://wiki.jikexueyuan.com/project/openresty/redis/auth_connect.html

           http://moguhu.com/article/detail?articleId=54

           https://www.cnblogs.com/digdeep/p/4859575.html

你可能感兴趣的:(OpenResty安装和redis的访问)