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传递。我无法找出问题的原因。

点赞
用户660579
用户660579

我是那个组件的作者。我会给你一些答案。首先,为什么你总是得到 Started -- 的记录是因为只有当你开始会话时才会设置 session.startedtrue。在这里,你只是打开了会话。所以这一行:

if not session.started then
...
end

将始终为真。

openstart 的不同之处在于,如果 cookie 即将过期,open 不会尝试更新它,而如果不存在会话(session.present), open 不会启动新会话。基本上,只有在不想自动更新 cookie,且只想对其进行只读访问时才使用 open

我将简要回答可能会导致重新连接会话的问题(我怀疑客户端可能没有将 cookie 发送回来,这可能是由于一些 cookie 属性,你尝试不指定 domain 吗?) 。

2017-03-11 15:28:40
用户660579
用户660579

示例 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 中传递域参数不重要。

2017-03-11 16:00:24