目前有一個需求,是需要將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拼接來獲得。