Nginx-Lua使用lua-resty-session模块无法启动会话
我有一个Nginx服务器,它作为转发代理使用。我想在架构中添加身份验证层,并使用Lua来完成。
我使用https://github.com/bungle/lua-resty-session模块来启用lua中的会话。
local session = require "resty.session".open{ cookie = { domain = cookie_domain } }
-- 读取一些数据
if session.present then
ngx.log(ngx.ERR, "Session -- "..session.id)
end
if not session.started then
session:start()
ngx.log(ngx.ERR, "Started -- ")
end
每当服务器接收到请求后,我都会收到一个日志消息
Started --
服务器配置:
server {
listen 80;
server_name {SERVER_IP};
# 大量的pagespeed配置
location / {
#基本身份验证
##auth_basic "Restricted";
##auth_basic_user_file {PATH_FOR_HTPASS_FILE};
access_by_lua_file {PATH_FOR_LUA_FILE};
# 缓存名称
proxy_cache browser_cache;
resolver 8.8.8.8;
# 应用程序1反向代理跟随
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://$http_host$uri$is_args$args;
}
}
唯一的问题是cookie_domain,服务器没有指向的域,我将服务器的IP地址作为cookie_domain传递。我无法找出问题的原因。
示例 Nginx 配置:
server {
listen 8090;
server_name 127.0.0.1;
location / {
access_by_lua_block {
local session = require "resty.session".open{
cookie = { domain = "127.0.0.1" }
}
if session.present then
ngx.log(ngx.ERR, "Session -- " .. ngx.encode_base64(session.id))
else
session:start()
ngx.log(ngx.ERR, "Started -- " .. ngx.encode_base64(session.id))
end
}
content_by_lua_block {
ngx.say "Hello"
}
}
}
现在使用 URL http://127.0.0.1:8090/在浏览器中打开。
服务器将向您发送此标头:
Set-Cookie:
session=acYmlSsZsK8pk5dPMu8Cow..|
1489250635|
lXibGK3hmR1JLPG61IOsdA..|
RdUK16cMz6c3tDGjonNahFUCpyY.;
Domain=127.0.0.1;
Path=/;
SameSite=Lax;
HttpOnly
并且这将被记录在您的 Nginx error.log 中:
2017/03/11 17:43:55 [error] 1100#0: *2
[lua] access_by_lua(nginx.conf:21):7:
Started -- acYmlSsZsK8pk5dPMu8Cow==,
client: 127.0.0.1,
server: 127.0.0.1,
request: "GET / HTTP/1.1",
host: "127.0.0.1:8090"
正是我们想要的。现在通过转到相同的 URL 刷新浏览器 (Windows 上的 F5,Mac 上的 CMD-R)。现在客户端将向服务器发送此标头:
Cookie: session=acYmlSsZsK8pk5dPMu8Cow..|
1489250635|
lXibGK3hmR1JLPG61IOsdA..|
RdUK16cMz6c3tDGjonNahFUCpyY.
一切仍然很好。并且这将被记录到 Nginx error.log 中:
2017/03/11 17:51:44 [error] 1100#0: *3
[lua] access_by_lua(nginx.conf:21):4:
Session -- acYmlSsZsK8pk5dPMu8Cow==,
client: 127.0.0.1,
server: 127.0.0.1,
request: "GET / HTTP/1.1",
host: "127.0.0.1:8090"
请注意,这里没有记录“Started”。
请阅读此说明: https://github.com/bungle/lua-resty-session#notes-about-turning-lua-code-cache-off
如果您有:lua_code_cache off;,则需要设置 secret,否则不同的 secret 将在每个请求上重新生成,这意味着我们永远无法附加到先前打开的会话,这意味着 Started 将记录在每个请求上。
另一个注意事项:
通常,如果您正在访问(单个)IP 地址,则不应设置 domain,因为浏览器默认情况下只会将 cookie 发送回同一 IP 地址,这意味着在 cookie 中传递域参数不重要。
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我是那个组件的作者。我会给你一些答案。首先,为什么你总是得到
Started --的记录是因为只有当你开始会话时才会设置session.started为true。在这里,你只是打开了会话。所以这一行:if not session.started then ... end将始终为真。
open和start的不同之处在于,如果 cookie 即将过期,open不会尝试更新它,而如果不存在会话(session.present),open不会启动新会话。基本上,只有在不想自动更新 cookie,且只想对其进行只读访问时才使用open。我将简要回答可能会导致重新连接会话的问题(我怀疑客户端可能没有将 cookie 发送回来,这可能是由于一些 cookie 属性,你尝试不指定
domain吗?) 。