想使用redis存储session,在ssl_session_fetch_by_lua*阶段根据session id从redis中获取对应的session data,但是会在redis:connect时报错,报错如下:
[crit] lua: cannot yield in sess get cb: missing async sess get cb support in OpenSSL while fetching SSL session by lua
代码如下:
ssl_session_fetch_by_lua_block {
local ssl_sess = require "ngx.ssl.session"
local sess_id, err = ssl_sess.get_session_id()
if not sess_id then
ngx.log(ngx.ERR, "failed to get session ID: ", err)
return
end
local sess_op = require "sessop"
local sess, err = sess_op.get_session_by_id_withred(sess_id)
ngx.log(ngx.ERR, "success got sess: ", sess, "error: ", err)
if not sess then
if err then
ngx.log(ngx.ERR, "failed to look up the session by ID ",
sess_id, ": ", err)
return
end
-- cache miss...just return
return
end
sess = ngx.decode_base64(sess)
local ok, err = ssl_sess.set_serialized_session(sess)
if not ok then
ngx.log(ngx.ERR, "failed to set SSL session for ID ", sess_id,
": ", err)
-- consider it as a cache miss...
return
end
}
sess_op.get_session_by_id_withred如下:
function _M.get_session_by_id_withred(sess_id)
local redis = require "resty.redis"
local red = redis:new()
local ok, err = red:connect("127.0.0.1", 6379)
ngx.log(ngx.ERR, "get function successed to connect: ", err)
if not ok then
ngx.log(ngx.ERR, "failed to connect: ", err)
return
end
ngx.log(ngx.ERR, "get session info by sess_id: ", sess_id)
local sess_encode, err = red:get(sess_id)
if not sess_encode then
ngx.log(ngx.ERR, "failed to get session data: ", err)
return
end
sess = ngx.decode_base64(sess_encode)
return sess
end