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