在nginx中採用lua對請求的url進行hash取模

    目前有一個需求,是需要將nginx反向代理的後端響應的內容進行緩存,並且要平均的分配到10個自定義的目錄中。一說到,自動分配的需求,採用hash取模是最常用也是最簡單的方案,其中選擇hash的字段(內容)必須是變化最多的。比如請求頭裏面的host和request_url,肯定選擇是request_url,因爲其變化的內容比較大。

    查看了nginx的官網文檔也沒有單獨對url進行取模的功能模塊,當然自己寫個set類型的模塊也就很容易的問題,但是不想那麼複雜的去實現這個方案。之前就提起過,在nginx中用lua腳本可以基本上實現服務端的任何功能了,當然我想這個功能應該可以很簡單的實現。

    首先,在nginx的conf中引入murmurHash的第三方實現(這點不得不吐槽下,堂堂lua,連個內部的hash實現都沒有)。

 lua_package_path "/home/youboy/nginx/ngx/lib/?.lua;;";
    init_by_lua '
                mmh2 = require "murmurhash2"
        ';
    這個引入和聲明指令是全局的,具體的可以看之前的博文。

    接下來是在location中實現取模,並將其賦予一個變量。

location /xxx {
                default_type 'text/plain';
           
                set $hs '1';
                set_by_lua $hs '
                        local x =ngx.var.server_name .. ngx.var.uri
                        hash = mmh2(x)
                        return hash%10;
                ';
                echo $hs;

        }
    請求的url要通過servername和uri拼接來獲得。

發佈了52 篇原創文章 · 獲贊 15 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章