smallfish bio photo

smallfish

Engineer at Alibaba, Taobao.com #golang #clojure #nginx-lua #postgres

Email Twitter Github

上一篇《Nginx第三方模块》涉及了数据库、Memcached以及Lua的扩展,但是相对于Web开发是不是还缺点什么呢?答案是回话(Session)模块。

这里还是需要感谢一下@agentzh,已经封装好了encrypted-session模块。模块依赖ngx_devel_kit包。模块地址如下:

编译很简单,类似如下:

./configure --prefix=/opt/nginx \
    --add-module=../ngx_devel_kit \
    --add-module=../encrypted-session-nginx-module

重新编译Nginx二进制,Nginx需要quit再启动。而普通配置更新则reload即可:

1. kill -HUP `cat /path/nginx/logs/nginx.pid`
2. /path/nginx/sbin/nginx -s reload

在测试之前,需要配置encrypted_session_key(长度32位)和encrypted_session_iv(长度16位)。

encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456";
encrypted_session_iv "1234567812345678";
encrypted_session_expires 5; # 默认过期时间是1d(一天)

话不到多说,直接来读写示例:

  • 写入session,测试session名为name,值是smallfish。
location /session-write {
    set $name 'smallfish';
    set_encrypt_session $session_name $name;
    set_encode_base32 $session_name;
    add_header "Set-Cookie" "name=$session_name";
    echo "write name: $session_name";
}
  • 读取session,Nginx读取Cookie方式为:$cookie_xxx。xxx为cookie的名称。
location /session-read {
    set_decode_base32 $session_name $cookie_name;
    set_decrypt_session $name $session_name;
    echo "read name: $name";
}

END