在nginx中采用lua对请求的url进行hash取模
2015-03-30 15:28
169 查看
目前有一个需求,是需要将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拼接来获得。
查看了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拼接来获得。
相关文章推荐
- Nginx+Lua+Redis 对请求进行限制
- Nginx+Lua+Redis 对请求进行限制
- 0139 Nginx+Lua+Redis 对请求进行限制
- Nginx+Lua+Redis 对请求进行限制
- nginx-lua+kafka进行数据采集
- 使用Nginx+Lua+Redis进行Web开发
- 使用HttpURLConnection采用Post方式请求数据
- Nginx通过请求的URL做定向路由策略
- Java中进行url请求(简单示例)
- 使用HttpUrlConnection进行post请求上传文件
- 通过nginx代理拦截请求,进行全局访问限制
- 【Nginx】下载,请求限速,根据URL参数限速
- Nginx通过请求的URL做定向路由策略
- nginx根据访问的url参数或者是请求 头部做判断转发
- 通过nginx + lua来统计nginx上的监控网络请求和性能
- Nginx实现url请求不区分大小写
- 于nginx的url和hash给squid提速的介绍
- 为nginx添加ngx_lua模块并进行安装测试
- wap项目:统一url 方便计费,采用转向,方便对字符进行编码
- 【Nginx】下载,请求限流限速,根据URL参数限速