[OpenResty]使用nginx lua清除proxy cache

原创 2018年01月03日 10:20:04

分享2篇文章,介绍了nginx proxy cache的原理,以及怎么使用lua做 cache purge, 包括单一url的清除,特别的支持了通配符的purge操作。

文章

代码

gist 需要梯子,为了方面,搬运过来了。有时间会补充个case。

通过 PURGE request 清除单个item gist url

-- Tit Petric, Monotek d.o.o., Thu 27 Oct 2016 10:43:38 AM CEST
--
-- Delete nginx cached assets with a PURGE request against an endpoint
--

local md5 = require 'md5'

function file_exists(name)
        local f = io.open(name, "r")
        if f~=nil then io.close(f) return true else return false end
end

function explode(d, p)
        local t, ll
        t={}
        ll=0
        if(#p == 1) then return {p} end
                while true do
                        l=string.find(p, d, ll, true) -- find the next d in the string
                        if l~=nil then -- if "not not" found then..
                                table.insert(t, string.sub(p, ll, l-1)) -- Save it in our array.
                                ll=l+1 -- save just after where we found it for searching next time.
                        else
                                table.insert(t, string.sub(p, ll)) -- Save what's left in our array.
                                break -- Break at end, as it should be, according to the lua manual.
                        end
                end
        return t
end

function cache_filename(cache_path, cache_levels, cache_key)
        local md5sum = md5.sumhexa(cache_key)
        local levels = explode(":", cache_levels)
        local filename = ""

        local index = string.len(md5sum)
        for k, v in pairs(levels) do
                local length = tonumber(v)
                -- add trailing [length] chars to index
                index = index - length;
                filename = filename .. md5sum:sub(index+1, index+length) .. "/";
        end
        if cache_path:sub(-1) ~= "/" then
                cache_path = cache_path .. "/";
        end
        filename = cache_path .. filename .. md5sum
        return filename
end

function purge(filename)
        if (file_exists(filename)) then
                os.remove(filename)
        end
end

if ngx ~= nil then
        local cache_key = ngx.var.lua_purge_upstream .. ngx.var.request_uri
        local filename = cache_filename(ngx.var.lua_purge_path, ngx.var.lua_purge_levels, cache_key)
        purge(filename)
        ngx.say("OK")
        ngx.exit(ngx.OK)
end

通配符清除cache 核心代码 gist url

-- Tit Petric, Monotek d.o.o., Tue 03 Jan 2017 06:54:56 PM CET
--
-- Delete nginx cached assets with a PURGE request against an endpoint
-- supports extended regular expression PURGE requests (/upload/.*)
--

function file_exists(name)
        local f = io.open(name, "r")
        if f~=nil then io.close(f) return true else return false end
end

function explode(d, p)
        local t, ll
        t={}
        ll=0
        if(#p == 1) then return {p} end
                while true do
                        l=string.find(p, d, ll, true) -- find the next d in the string
                        if l~=nil then -- if "not not" found then..
                                table.insert(t, string.sub(p, ll, l-1)) -- Save it in our array.
                                ll=l+1 -- save just after where we found it for searching next time.
                        else
                                table.insert(t, string.sub(p, ll)) -- Save what's left in our array.
                                break -- Break at end, as it should be, according to the lua manual.
                        end
                end
        return t
end

function purge(filename)
        if (file_exists(filename)) then
                os.remove(filename)
        end
end

function trim(s)
        return (string.gsub(s, "^%s*(.-)%s*$", "%1"))
end

function exec(cmd)
        local handle = io.popen(cmd)
        local result = handle:read("*all")
        handle:close()
        return trim(result)
end

function list_files(cache_path, purge_upstream, purge_pattern)
        local result = exec("/usr/bin/find " .. cache_path .. " -type f | /usr/bin/xargs --no-run-if-empty -n1000 /bin/grep -El -m 1 '^KEY: " .. purge_upstream .. purge_pattern .. "' 2>&1")
        if result == "" then
                return {}
        end
        return explode("\n", result)
end

if ngx ~= nil then
        -- list all cached items matching upstream+request_uri (extended regex)
        local files = list_files(ngx.var.lua_purge_path, ngx.var.lua_purge_upstream, ngx.var.request_uri)

        ngx.header["Content-type"] = "text/plain; charset=utf-8"
        ngx.header["X-Purged-Count"] = table.getn(files)
        for k, v in pairs(files) do
                purge(v)
        end
        ngx.say("OK")
        ngx.exit(ngx.OK)
end
版权声明:本文为orangleliu (http://blog.csdn.net/orangleliu/)原创文章,自由传播,文章转载请声明, 多谢。

Nginx lua code cache开关

从这里拿的:https://groups.google.com/forum/#!topic/openresty/W0dvD5Wm0Bw lua_code_cache 问题 4...
  • qinyushuang
  • qinyushuang
  • 2015年04月03日 17:48
  • 8903

lua实现nginx proxy_store的purge缓存清理的方法

lua实现nginx proxy_store的purge缓存清理的方法 nginx缓存的方式有五种: 传统缓存(404)、传统缓存(!-e)、基于memcached的缓存、基于第三方插件ncache、...
  • liuyunfengheda
  • liuyunfengheda
  • 2013年11月22日 11:05
  • 6016

nginx内置缓存Proxy_cache之清除

nginx的第三方模块 可以在原有基础上直接增加模块,只能一个一个访问,比较麻烦 #wget http://labs.frickle.com/files/ngx_cache_purge-2....
  • tshangshi
  • tshangshi
  • 2016年07月21日 21:37
  • 2795

使用Nginx+Lua(OpenResty)开发高性能Web应用

使用Nginx+Lua(OpenResty)开发高性能Web应用
  • hj419460467
  • hj419460467
  • 2016年06月03日 14:02
  • 3780

openresty--基于redis实现一个动态路由

本文的一个例子主要介绍如何利用redis实现对请求头中User-Agent修改已达到路由到两个不同的http后台的目的。这个例子使用了这些openresty组件: Redis2 Nginx Modul...
  • cjfeii
  • cjfeii
  • 2016年04月15日 10:21
  • 3360

使用Nginx+Lua(OpenResty)开发高性能Web应用

在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。Nginx的高性能是大家公认的,而Nginx开...
  • hdchenyue
  • hdchenyue
  • 2016年05月27日 13:48
  • 633

使用Nginx+Lua(OpenResty)开发高性能Web应用

使用Nginx+Lua(OpenResty)开发高性能Web应用
  • hj419460467
  • hj419460467
  • 2016年06月03日 14:02
  • 3780

使用Nginx+Lua(OpenResty)开发高性能Web应用

在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存、限流等场景;而把Nginx作为一个Web容器使用的还不是那么广泛。Nginx的高性能是大家公认的,而Nginx开...
  • English0523
  • English0523
  • 2016年12月08日 09:48
  • 628

使用Nginx+Lua(OpenResty)开发高性能Web应用

使用Nginx+Lua(OpenResty)开发高性能Web应用 2016-03-06 张开涛 开涛的博客 几乎所有互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代...
  • quan7394
  • quan7394
  • 2017年02月11日 17:07
  • 278

使用Nginx+Lua(OpenResty)开发高性能Web应用

原文出自:http://jinnianshilongnian.iteye.com/blog/2280928   在互联网公司,Nginx可以说是标配组件,但是主要场景还是负载均衡、反向代理、代理缓存...
  • xlxxcc
  • xlxxcc
  • 2017年03月18日 22:34
  • 649
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[OpenResty]使用nginx lua清除proxy cache
举报原因:
原因补充:

(最多只允许输入30个字)