异想天开

What's the true meaning of light, Could you tell me why

nginx的access校验功能

日期:2015-02-03 15:50:23
  
最后更新日期:2015-02-03 15:52:43
【技术】
这里使用的环境为nginx的集成开发包,集成了lua模块以及其他丰富的第三方模块的openresty。利用它用lua脚本做一个防盗链的功能的工作量比写nginx的c模块的学习成本和编码成本大量减少了。比如这样就可以做一个类似10s内限制访问50次的功能。 [code lang="cpp"]
#access.lua
local ip = ngx.var.binary_remote_addr
local limit = ngx.shared.limit
local req,_=limit:get(ip)
if req then
if req > 50 then
ngx.exit(403)
else
limit:incr(ip,1)
end
else
limit:set(ip,1,10)
end
[/code]
这里利用的共享内存设置key的过期时间为10s,同时把ip作为key。需要在nginx.conf里面添加共享内存limit
[code lang="cpp"]
lua_shared_dict limit 10m; //该配置放在http配置块中,server配置块外
[/code]
和某个location下指定使用该access.lua校验。
[code lang="cpp"]
access_by_lua_file "/data/www/lua/access.lua";
[/code]
由于前面返回的是403,还可以自己指定403返回的内容。比如:
[code lang="cpp"]
error_page 403 /403.html;
location = /403.html {
default_type text/html;
root html;
}
[/code]
403.html这个页面可以填你想要返回的内容,比如json或xml都行。