




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 南昌航空大學《土力學含實驗》2023-2024學年第二學期期末試卷
- 呂梁學院《軟筆書法》2023-2024學年第二學期期末試卷
- 牡丹江師范學院《算法設計與分析Ⅲ》2023-2024學年第二學期期末試卷
- 南陽理工學院《IntroductiontoMicroprocessors》2023-2024學年第二學期期末試卷
- 上海工藝美術職業學院《醫學分子生物學實驗技術》2023-2024學年第一學期期末試卷
- 南充科技職業學院《生態學原理》2023-2024學年第二學期期末試卷
- 天津理工大學中環信息學院《中學化學教學方法與理論》2023-2024學年第二學期期末試卷
- 二零二五范文公園游樂場地租賃合同
- 護坡承包合同書范例
- 二零二五工程停工補償協議
- 公交車輛輕量化與節能技術
- 醫院納入定點后使用醫療保障基金的預測性分析報告
- 數據庫運維培訓
- 影視廣告賞析(哈爾濱師范大學)智慧樹知到期末考試答案2024年
- 培訓機構與家長溝通技巧
- 醫療機構執業登記匯報
- 保安交通安全常識教育
- 2022年10月自考00883學前特殊兒童教育試題及答案含解析
- 【海南康養旅游現狀和對策探究11000字(論文)】
- 《浙江省建筑垃圾資源化利用技術導則》
- (高清版)DZT 0002-2017 含煤巖系鉆孔巖心描述
評論
0/150
提交評論