Nginx Lua会话不使用模块Lua resty session启动

Nginx Lua会话不使用模块Lua resty session启动,session,nginx,proxy,lua,openresty,Session,Nginx,Proxy,Lua,Openresty,我有一个nginx服务器,我正在使用它作为转发代理。我想在体系结构中添加一层身份验证,我正在使用Lua进行同样的验证 我正在使用模块启用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)

我有一个nginx服务器,我正在使用它作为转发代理。我想在体系结构中添加一层身份验证,我正在使用Lua进行同样的验证

我正在使用模块启用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\u域,服务器没有指向的域,我将服务器的IP地址作为cookie\u域传递。我无法找出问题的原因。

我是该组件的作者。我会给你一些答案。第一个答案,为什么您总是得到
启动--
记录是因为
会话。只有在启动会话时,启动的
才会设置为
true
。这里您只打开会话。所以这句话:

如果未启动会话,则
...
结束

永远都是真的

open
start
是不同的,因为
open
不会在cookie即将过期时尝试续订cookie。如果会话不存在,
open
将不会启动新会话(
session.present
)。基本上,只有当您不想自动续订Cookie,并且只想以只读方式访问Cookie时,才使用open


我将很快回答重新连接会话时可能出现问题的原因(我怀疑客户端可能无法将cookie发送回,这可能是因为某些cookie属性,您是否尝试过不指定
)?

我是该组件的作者。我会给你一些答案。第一个答案,为什么您总是得到
启动--
记录是因为
会话。只有在启动会话时,启动的
才会设置为
true
。这里您只打开会话。所以这句话:

如果未启动会话,则
...
结束

永远都是真的

open
start
是不同的,因为
open
不会在cookie即将过期时尝试续订cookie。如果会话不存在,
open
将不会启动新会话(
session.present
)。基本上,只有当您不想自动续订Cookie,并且只想以只读方式访问Cookie时,才使用open

我将很快回答重新连接会话时可能出现问题的原因(我怀疑客户端可能无法将cookie发送回,这可能是因为某些cookie属性,您是否尝试过不指定
)?

示例Nginx Config:

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的浏览器

服务器将向您发送此标头:

Set-Cookie:
       session=acYmlSsZsK8pk5dPMu8Cow..|
       1489250635|
       lXibGK3hmR1JLPG61IOsdA..|
       RdUK16cMz6c3tDGjonNahFUCpyY.;
       Domain=127.0.0.1;
       Path=/;
       SameSite=Lax;
       HttpOnly
这将记录在您的Nginx
错误中。日志

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"
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"
这正是我们想要的。现在通过转到相同的url刷新浏览器(Windows上为F5,Mac上为CMD-R)。现在,客户端将此标头发送到服务器:

Cookie: session=acYmlSsZsK8pk5dPMu8Cow..|
      1489250635|
      lXibGK3hmR1JLPG61IOsdA..|
      RdUK16cMz6c3tDGjonNahFUCpyY.
一切都很好。这将被记录到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"
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"
看,它没有在这里记录启动的

请同时阅读:

如果您有:
lua\u code\u缓存关闭
然后您需要设置
机密
,否则不同的
机密
将在每个请求上重新建立,这意味着我们将永远无法附加到以前打开的会话,这意味着
已启动
将在每个请求上登录

另一项说明:

通常,如果您正在访问(单个)IP地址,则不应设置域,因为默认情况下,浏览器将只将cookie发送回同一IP地址,这意味着在cookie中传递域参数并不重要。

示例Nginx Config:

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的浏览器

服务器将向您发送此标头:

Set-Cookie:
       session=acYmlSsZsK8pk5dPMu8Cow..|
       1489250635|
       lXibGK3hmR1JLPG61IOsdA..|
       RdUK16cMz6c3tDGjonNahFUCpyY.;
       Domain=127.0.0.1;
       Path=/;
       SameSite=Lax;
       HttpOnly
这将记录在您的Nginx
错误中。日志

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"
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"
这正是我们想要的。现在通过转到相同的url刷新浏览器(Windows上为F5,Mac上为CMD-R)。现在,客户端将此标头发送到服务器:

Cookie: session=acYmlSsZsK8pk5dPMu8Cow..|
      1489250635|
      lXibGK3hmR1JLPG61IOsdA..|
      RdUK16cMz6c3tDGjonNahFUCpyY.
一切都很好。这将被记录到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"
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"
看,它没有在这里记录启动的

请同时阅读:

如果您有:
lua\u code\u缓存关闭
然后您需要设置
机密
,否则不同的
机密
将在每个请求上重新建立,这意味着我们将永远无法附加到以前打开的会话,这意味着
已启动
将在每个请求上登录

另一项说明:


一般来说,如果您正在访问(单个)IP地址,您不应该设置
,因为默认情况下,浏览器只会将cookie发送回相同的IP地址,这意味着在cookie中传递域参数并不重要。

Hi@bungle,我想,问题已经解决了。下面是最后一段有效的代码
localsession=session或需要“resty.session”。start{secret=“7A7mLtj97p4658r2KahQ6A48awHG2b9d”}
但我一直在设置和检索session变量。。我正在调查!非常感谢。我不知道那篇文章是做什么的,因为我没有看到所有的代码。那是什么:会话还是?您可以使用session.data.variable=“value”设置会话变量。实际上,我在lua中看到了一段代码,它直接从内存中使用d变量,而不是重新分配它<代码>本地会话=会话或需要“resty.session”。启动{secret=“7A7mLtj97p4658r2KahQ6A48awHG2b9d”}
。第二,我也完成了会话变量问题。谢谢哦,好吧,一个全局Lua变量,用来防止调用
start
两次,或者别的什么。嗨@bungle,我想,问题已经解决了。下面是最后一段有效的代码
localsession=session或要求“resty.session”。开始{secret=“7A7mLtj97p4658r2KahQ6A48awHG2b9d”}
但我一直在使用设置和