Nginx-Lua 会话没有启动使用模块 lua-resty-session
Nginx-Lua session does not start using module lua-resty-session
我有一个 nginx 服务器,我将其用作转发代理。我想为架构添加一个身份验证层,我正在使用 Lua 进行相同的操作。
我正在使用 https://github.com/bungle/lua-resty-session 模块在 lua 中启用会话。
local session = require "resty.session".open{ cookie = { domain = cookie_domain } }
-- Read some data
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
在服务器收到每个请求后,我都会收到日志消息
开始--
服务器配置:
server {
listen 80;
server_name {SERVER_IP};
# tons of pagespeed configuration
location / {
#basic authentication
##auth_basic "Restricted";
##auth_basic_user_file {PATH_FOR_HTPASS_FILE};
access_by_lua_file {PATH_FOR_LUA_FILE};
# cache name
proxy_cache browser_cache;
resolver 8.8.8.8;
# app1 reverse proxy follow
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。我无法找出问题的原因。
我是该组件的作者。我会给你几个答案。第一个答案,为什么你总是记录 Started --
是因为 session.started
只会在你启动会话时设置为 true
。在这里你只打开会话。所以行:
if not session.started then
...
end
永远是真的。
open
和 start
的不同之处在于 open
不会尝试更新即将过期的 cookie。如果不存在 (session.present
),open
将不会启动新会话。基本上,只有当您不想自动更新 cookie 时才使用 open,并且您只想对其进行只读访问。
我会尽快回答什么可能导致重新连接会话的问题(我怀疑客户端可能没有发送回 cookie,也可能是因为某些 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/ 打开浏览器。
服务器将向您发送此 header:
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 刷新浏览器(F5 在 Windows,CMD-R 在 Mac)。现在客户端将这个 header 发送到服务器:
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
将在每次请求时重新生成,这意味着我们将永远无法附加到之前打开的 session,这意味着 Started
将记录每个请求。
一个补充说明:
一般来说,如果您正在访问(单个)IP 地址,则不应设置 domain
,因为默认情况下,浏览器只会将 cookie 发送回同一 IP 地址,这意味着在 cookie 中传递域参数并不重要。
我有一个 nginx 服务器,我将其用作转发代理。我想为架构添加一个身份验证层,我正在使用 Lua 进行相同的操作。
我正在使用 https://github.com/bungle/lua-resty-session 模块在 lua 中启用会话。
local session = require "resty.session".open{ cookie = { domain = cookie_domain } }
-- Read some data
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
在服务器收到每个请求后,我都会收到日志消息
开始--
服务器配置:
server {
listen 80;
server_name {SERVER_IP};
# tons of pagespeed configuration
location / {
#basic authentication
##auth_basic "Restricted";
##auth_basic_user_file {PATH_FOR_HTPASS_FILE};
access_by_lua_file {PATH_FOR_LUA_FILE};
# cache name
proxy_cache browser_cache;
resolver 8.8.8.8;
# app1 reverse proxy follow
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。我无法找出问题的原因。
我是该组件的作者。我会给你几个答案。第一个答案,为什么你总是记录 Started --
是因为 session.started
只会在你启动会话时设置为 true
。在这里你只打开会话。所以行:
if not session.started then
...
end
永远是真的。
open
和 start
的不同之处在于 open
不会尝试更新即将过期的 cookie。如果不存在 (session.present
),open
将不会启动新会话。基本上,只有当您不想自动更新 cookie 时才使用 open,并且您只想对其进行只读访问。
我会尽快回答什么可能导致重新连接会话的问题(我怀疑客户端可能没有发送回 cookie,也可能是因为某些 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/ 打开浏览器。
服务器将向您发送此 header:
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 刷新浏览器(F5 在 Windows,CMD-R 在 Mac)。现在客户端将这个 header 发送到服务器:
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
将在每次请求时重新生成,这意味着我们将永远无法附加到之前打开的 session,这意味着 Started
将记录每个请求。
一个补充说明:
一般来说,如果您正在访问(单个)IP 地址,则不应设置 domain
,因为默认情况下,浏览器只会将 cookie 发送回同一 IP 地址,这意味着在 cookie 中传递域参数并不重要。