Web服務器(Nginx)控制用戶訪問頻率的解決方案_第1頁
Web服務器(Nginx)控制用戶訪問頻率的解決方案_第2頁
Web服務器(Nginx)控制用戶訪問頻率的解決方案_第3頁
Web服務器(Nginx)控制用戶訪問頻率的解決方案_第4頁
Web服務器(Nginx)控制用戶訪問頻率的解決方案_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Web服務器(Nginx)控制用戶訪問頻率的解決方案Nginx來處理訪問控制的方法有多種,實現的效果也有多種,訪問IP段,訪問內容限制,訪問頻率限制等。用Nginx+Lua+Redis來做訪問限制主要是考慮到高并發環境下快速訪問控制的需求。Nginx處理請求的過程一共劃分為11個階段,分別是:post-read、server-rewrite、find-config、rewrite、post-rewrite、 preaccess、access、post-access、try-files、content、log.在openresty中,可以找到:set_by_lua,access_by_lua,c

2、ontent_by_lua,rewrite_by_lua等方法。那么訪問控制應該是,access階段。1.解決思路按照正常的邏輯思維,我們會想到的訪問控制方案如下:1.檢測是否被forbidden?=是,forbidden是否到期:是,清除記錄,返回200,正常訪問;否,返回403;=否,返回200,正常訪問2.每次訪問,訪問用戶的訪問頻率+1處理3.檢測訪問頻率是否超過限制,超過即添加forbidden記錄,返回403這是簡單地方案,還可以添加點枝枝葉葉,訪問禁止時間通過算法導入,每次凹曲線增加。2.Config首先為nginx添加vhost配置文件,vhost.conf部分內容如下:123

3、4567891011121314lua_package_path "/usr/local/openresty/lualib/?.lua;"#告訴openresty庫地址lua_package_cpath "/usr/local/openresty/lualib/?.so;"error_log /usr/local/openresty/nginx/logs/openresty.debug.log debug;server listen 8080 default; server_name localhost; root /; location /login

4、default_type 'text/html' access_by_lua_file "/usr/local/openresty/nginx/lua/access_by_redis.lua"#通過lua來處理訪問控制 3.Access_by_redis.lua參考了下的做法,redis存儲方案只做簡單地string存儲就足夠了。key分別是:用戶登錄記錄:user::time(unix時間戳)訪問限制:block:先連接Redis吧:12345678local red = redis:new()function M:re

5、dis()red:set_timeout(1000)local ok, err = red:connect("", 6379)if not ok thenngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)endend按照我們的邏輯方案,第二步是,檢測是否forbidden,下面我們就檢測block:,如果搜索到數據,檢測時間是否過期,未過期返回403,否則直接返回200:12345678910111213function M:check1()local time=os.time()-system timelo

6、cal res, err = red:get("block:".ngx.var.remote_addr)if not res then- redis errorngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) -redis get data error endif type(res) = "string" then -if red not null then type(red)=stringif tonumber(res) >= tonumber(time) then -check if forbidden expi

7、redngx.exit(ngx.HTTP_FORBIDDEN)-ngx.say("forbidden")endend接下來會做檢測,是否訪問頻率過高,如果過高,要拉到黑名單的,實現的方法是,檢測user::time的值是否超標:123456789101112131415function M:check2()local time=os.time()-system timelocal res, err = red:get("user:".ngx.var.remote_addr.":".time)if not res th

8、en- redis errorngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) -redis get data errorendif type(res) = "string" thenif tonumber(res) >= 10 then - attack, 10 times request/sred:del("block:".self.ip)red:set("block:".self.ip, tonumber(time)+5*60 ) -set block timengx.exit(ngx.HTTP_FORBIDDEN)endendend最后呢,還要記得,把每次訪問時間做一個自增長,user::time:1234567function M:add()local time=os.time()-system timeok, err = red:incr("user:".ngx.var.remote_addr.":"

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論