【问题标题】:Nginx-Lua session does not start using module lua-resty-sessionNginx-Lua 会话不使用模块 lua-resty-session 启动
【发布时间】:2017-07-31 22:12:57
【问题描述】:

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

【问题讨论】:

    标签: session nginx proxy lua openresty


    【解决方案1】:

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

    if not session.started then ... end

    永远是真的。

    open 和start 在这个意义上是不同的,open 在 cookie 即将过期时不会尝试更新它。如果不存在,open 将不会启动新会话 (session.present)。基本上,只有当您不想自动更新 cookie 并且您只想要对它的只读访问权限时,您才使用 open。

    我将很快回答可能导致重新连接会话的问题(我怀疑客户端可能没有将cookie发送回来,可能是因为某些cookie属性,您是否尝试过不指定domain)?

    【讨论】:

    • 嗨@bungle,我想,问题已经解决了。这是最后一段有效的代码。 local session = session or require "resty.session".start{ secret = "7A7mLtj97p4658r2KahQ6A48awHG2b9d" } 但我坚持设置和检索会话变量.. 我正在调查它!非常感谢。
    • 我不知道那部分是做什么的,因为我没有看到所有代码。那是什么:会话或...?您可以使用 session.data.variable = "value" 设置会话变量。
    • 实际上我在 lua 中看到了一段代码,它直接从内存中使用 d 变量而不是重新分配它..local session = session or require "resty.session".start{ secret = "7A7mLtj97p4658r2KahQ6A48awHG2b9d" }。其次,我也解决了会话变量问题。谢谢!
    • 哦,好吧,一个全局 Lua 变量来防止调用 start 两次,或者什么的。
    【解决方案2】:

    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 中传递域参数真的很重要。

    【讨论】:

      猜你喜欢
      • 2016-12-13
      • 1970-01-01
      • 2019-01-06
      • 2017-05-01
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 2017-04-28
      • 1970-01-01
      相关资源
      最近更新 更多