近期由於工作需要,做了些防DDOS攻擊的研究,發現nginx本身就有這方面的模塊ngx_http_limit_req_module和ngx_http_limit_conn_module。
一、基本介紹
1.ngx_http_limit_req_module
配置格式及說明:
設置一個緩存區保存不同key的狀態,這里的狀態是指當前的過量請求數。而key是由variable指定的,是一個非空的變量,我們這里使用$binary_remote_addr,表示源IP為key值。
limit_req_zone $variable zone=name:size rate=rate;
指定要進行限制的緩存區和最大的請求到達后有多少個請求放入延遲隊列(其它的直接丟棄)。如果不希望請求數達到上限而被延遲,就需要使用nodelay。
limit_req zone=name [burst=number] [nodelay];
例子:
緩存區為10M,請求限制為每秒1次,延遲隊列為5
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ... server { ... location /search/ { limit_req zone=one burst=5; }
}
2.ngx_http_limit_conn_module
配置格式及說明:
設置一個緩存區保存不同key的狀態。我們這里使用源IP來作為key,以此限制每個源IP的鏈接數
limit_conn_zone $binary_remote_addr zone=addr:10m;
指定限制的緩存區,並指定每個key的鏈接個數
limit_conn zone number;
例子:
http { limit_conn_zone $binary_remote_addr zone=addr:10m; ... server { ... location /download/ { limit_conn addr 1; } }
二、實際應用
如果作為代理服務器,我們需要限制每個用戶的請求速度和鏈接數量,但是,由於一個頁面有多個子資源,如果毫無選擇的都進行限制,那就會出現很多不必要的麻煩,如:一個頁面有40個子資源,那么如果想讓一個頁面完整的顯示,就需要將請求速度和連接數都調整到40,以此達到不阻塞用戶正常請求,而這個限制,對服務器性能影響很大,幾百用戶就能把一台nginx的處理性能拉下來。
所以我們需要制定哪些請求是需要進行限制的,如html頁面;哪些是不需要限制的,如css、js、圖片等,這樣就需要通過配置對應的location進一步細化。
注:location介紹見最后附錄
我們不對css、js、gif、png,jpg等進行連接限制,而對除此之外的鏈接進行限制
http { limit_conn_zone $binary_remote_addr zone=addr:10m; limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s; ... server { ... location ~ .*\.(gif|png|css|js|icon)$ { proxy_set_header Host $http_host; proxy_set_header X-Real_IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ~* .*\.(jpeg|jpg|JPG)$ { proxy_set_header Host $http_host; proxy_set_header X-Real_IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # image_filter resize 480 -; # image_filter_jpeg_quality 50; # image_filter_sharpen 10; # image_filter_buffer 4M; } location / { proxy_set_header Host $http_host; proxy_set_header X-Real_IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #limit limit_conn addr 3; limit_req zone=one burst=5; } }
附錄:Location配置簡單介紹(轉自http://blog.sina.com.cn/s/blog_97688f8e0100zws5.html)