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

永远是真的。

openstart 的不同之处在于 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 中传递域参数并不重要。