xx通CGI流量控制,xxcgi流量控制
流量控制共分2步,首先在CGI框架對用戶的ip作限制,第二限制每個CGI的流量。
一、基於IP的流量控制
用共享內存(shm)的方式保存基於ip的訪問信息。
配置文件中 <variable name="ip_limit_default" limit_int="60" shm_key="1653" recal_int="300" max_count="600" >
shm_key是共享內存的id,limit_int是用戶超過限制後的冷凍時間,recal_int是統計時間,max_count是統計時間內允許的最大請求次數。
httpd啟動後,首次被訪問的cgi進行shm的初始化,申請一段連續的空間並初始化為0. shm結構如下圖所示:
當一個請求到來時,根據用戶ip做hash,我們的算法很簡單,取ip地址最末一個字節,將ip散列到256個段(如上圖所示),再在每個段內根據key(ip地址)進行順序查找,查找時會統計所過結點的最小count。如果沒找到,首先用空結點,其次用24小時未更新過的結點,最後用訪問次數最少(即最小count的結點)。這樣總會返回一個結點。
每recal_int時間對count和time重置,如果count超過了max_count就對用戶冷凍limit_int時間,limit_int時間過後再將time和count重置。
這裡面所有的更新都是基於用戶請求的到來,系統不會根據time對shm結點做老化處理
二、基於CGI的流量控制
利用CKV的超時來統計CGI的流量。
在CKV建立兩個key, LockKey用於統計時間,LimitKey用於統計次數。
LockKey會根據設置的expire時間自動過期。
每個請求到來時,取Limitkey加1,未達上限就繼續訪問,達到上限時要檢查LockKey是否過期,如果過期則重置LimitKey並放行,未過期則限制訪問。