nginx+memcached=http cache

上周末在openparty听了taobao @agentzh的 nginx scripting hack的主题演讲,心情万分激动,就像一个原始人发现了一把电锯似的的感觉,正好赶上项目需要一个http cache,就借机实践了一把。
过程中,代码量少的令人发指。
业务描述:根据para中的三个参数构造一个复合key,进行memcached的存(post)取(get)

这段是 get 逻辑
        location /cache/get {
                echo_exec /cache/get/$arg_from$arg_to$arg_date;
        }

        location ~ '^/cache/get/(.*)$'{
                internal;
                set $memc_key $1;
                set $memc_cmd get;
                # format definition is at below
                access_log logs/getmemc.log memc;
                memc_pass my_memc_backend;
               #404 处理
                error_page 404  = @nodata;
        }

        location @nodata{
                echo "NO_DATA";
        }



这段是 set 逻辑
        location /cache/set {
               #大数据提交,若写缓存文件,可能导致form_input无法读取
                client_body_buffer_size 20k;
                #读取post para
                set_form_input $from;
                set_form_input $to;
                set_form_input $date;
                set_form_input $memc_value content;
                # 用lua进行拼接key
                set_by_lua $memc_key "return ngx.arg[1]..ngx.arg[2]..ngx.arg[3]" $from $to $date;
                # format 'memc' definition is at below
                access_log  logs/setmemc.log memc;

                set $memc_cmd   set;
                set $memc_exptime      0;

                memc_pass my_memc_backend;
        }


这段应该放在头部,供下面引用
#format for memc about
    log_format  memc '$remote_addr [$time_local] $memc_key $body_bytes_sent';


但是简单的前提是“站在巨人的肩膀上”,感谢 @agentzh  @chaoslawful 在nginx社区的贡献。以下是用到的他们开发的mod
 --add-module=/root/agentzh-echo-nginx-module-22f3f7e\
 --add-module=/root/agentzh-memc-nginx-module-1128d82\
 --add-module=/root/calio-form-input-nginx-module-8f05d08\
 --add-module=/root/chaoslawful-lua-nginx-module-0ef14aa\
 --add-module=/root/ngx_http_upstream_keepalive-2ce9d8a1ca93\
 --add-module=/root/simpl-it-ngx_devel_kit-8d75c70


后感:
nginx可以学一点,高度的可扩展,大有前途。而且有个重点是里面的中文开发者很活跃,比如上面两位。

补充:client_body_buffer_size 20k; POST数据包太大,超过默认buff(8k)时,会写到临时文件,导致 $request_body 读取有问题。


相关ppt
http://agentzh.org/misc/slides/nginx-conf-scripting/
http://agentzh.org/misc/slides/recent-dev-nginx-conf/

你可能感兴趣的:(nginx,cache,memcached,bash,lua)