nginx防DDOS攻擊的簡單配置


  近期由於工作需要,做了些防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

  

語法規則: location [=|~|~*|^~] /uri/ { … }
= 開頭表示精確匹配
 
^~ 開頭表示uri以某個常規字符串開頭,理解為匹配 url路徑即可。nginx不對url做編碼,因此請求為/static/20%/aa,可以被規則^~ /static/ /aa匹配到(注意是空格)。
 
~ 開頭表示區分大小寫的正則匹配
 
~*  開頭表示不區分大小寫的正則匹配
 
!~和!~*分別為區分大小寫不匹配及不區分大小寫不匹配 的正則
 
/ 通用匹配,任何請求都會匹配到。
 
多個location配置的情況下匹配順序為(參考資料而來,還未實際驗證,試試就知道了,不必拘泥,僅供參考):
 
首先匹配 =,其次匹配^~, 其次是按文件中順序的正則匹配,最后是交給 / 通用匹配。當有匹配成功時候,停止匹配,按當前匹配規則處理請求。
 
例子,有如下匹配規則:
 
 
location = / {
   #規則A
}
location = /login {
   #規則B
}
location ^~ /static/ {
   #規則C
}
location ~ \.(gif|jpg|png|js|css)$ {
   #規則D
}
location ~* \.png$ {
   #規則E
}
location !~ \.xhtml$ {
   #規則F
}
location !~* \.xhtml$ {
   #規則G
}
location / {
   #規則H
}

  

那么產生的效果如下:
 
訪問根目錄/, 比如http://localhost/ 將匹配規則A
 
訪問 http://localhost/login 將匹配規則B,http://localhost/register 則匹配規則H
 
訪問 http://localhost/static/a.html 將匹配規則C
 
訪問 http://localhost/a.gifhttp://localhost/b.jpg 將匹配規則D和規則E,但是規則D順序優先,規則E不起作用, 而 http://localhost/static/c.png 則優先匹配到 規則C
 
訪問 http://localhost/a.PNG 則匹配規則E, 而不會匹配規則D,因為規則E不區分大小寫。
 
 
訪問 http://localhost/category/id/1111 則最終匹配到規則H,因為以上規則都不匹配,這個時候應該是nginx轉發請求給后端應用服務器,比如FastCGI(php),tomcat(jsp),nginx作為方向代理服務器存在。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM