nginx能夠經過limit_conn_zone 和limit_req_zone兩個組件來對客戶端訪問目錄和文件的訪問頻率和次數進行限制,另外還能夠善用進行服務安全加固,兩個模塊都可以對客戶端訪問進行限制,具體如何使用要結合公司業務環境進行配置。css
如能善用此模塊可以對 cc、ddos等此類的攻擊進行有效的防護。html
一:nginx訪問限制模塊簡介node
nginx限速配置指令nginx
1.安全
指令服務器
limit_zonesession
語法:limit_conn_zone $variable zone=name:size;併發
默認值:notcp
使用字段:http性能
指令描述會話狀態存儲區域。
會話的數目按照指定的變量來決定,它依賴於使用的變量大小和memory_max_size的值。
2.
指令
limit_conn
語法:limit_conn zone_name max_clients_per_ip
默認值:no
使用字段:http, server, location
指令指定一個會話的最大同時鏈接數,超過這個數字的請求將被返回」Service unavailable」 (503)代碼。
以下例:
http { imit_conn_zone $binary_remote_addr zone=one:10m; ............ server { listen 80; server_name www.abc.com; location / { limit_conn one 1; #這將指定一個地址只能同時存在一個鏈接。「one」與上面的對應,也能夠自定義命名 limit_rate 300k; } }
limit_zone: 是針對每一個IP定義一個存儲session狀態的容器.這個示例中定義了一個10m的容器,按照32bytes/session, 能夠處理320000個session。
limit_conn one 1:限制每一個IP只能發起一個併發鏈接。
limit_rate 300k: 對每一個鏈接限速300k. 注意,這裏是對鏈接限速,而不是對IP限速。若是一個IP容許兩個併發鏈接,那麼這個IP就是限速limit_rate×2。
nginx限制訪問頻率配置指令
3.
指令
limit_req_zone
語法:limit_req_zone $session_variable zone=name:size rate=rate
默認值:none
上下文:http
命令解析:爲session會話狀態分配一個大小爲size的內存存儲區,限制了每秒(分、小時)只接受rate個IP的頻率。
4.
指令
limit_req
語法:limit_req zone=name burst=burst [nodelay]
默認值:none
使用字段:http、server、location
命令解析:該指令用於指定使用的內存存儲區(zone)名稱,以及最大的突發請求數(burse)。若是請求的速率超過了limit_req_zone指令中設置的速率,這些請求將被延遲處理,在這種狀況下,請求得到服務不可用信息,返回503狀態碼。
以下例:
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { location /{ limit_req zone=one burst=10; } }
上面的參數會讓nginx 每一個IP一秒鐘只處理一個請求,可是仍然會有不少還在隊列裏面等待處理,這樣也會佔用不少tcp鏈接,從上面那條命令的結果中就能看得出來。
若是加上nodelay就會當即丟棄
limit_req zone=one burst=10 nodelay;
5.
指令
limit_conn_log_level
語法: limit_conn_log_level info | notice | warn | error
默認值: error
使用字段: http, server, location
指定當鏈接數超過設定的最大鏈接數,服務器限制鏈接時的日誌等級。
2、實際應用
若是做爲代理服務器,咱們須要限制每一個用戶的請求速度和連接數量,可是,因爲一個頁面有多個子資源,若是毫無選擇的都進行限制,那就會出現不少沒必要要的麻煩,如:一個頁面有40個子資源,那麼若是想讓一個頁面完整的顯示,就須要將請求速度和鏈接數都調整到40,以此達到不阻塞用戶正常請求,而這個限制,對服務器性能影響很大,幾百用戶就能把一臺nginx的處理性能拉下來。
因此咱們須要制定哪些請求是須要進行限制的,如html頁面;哪些是不須要限制的,如css、js、圖片等,這樣就須要經過配置對應的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; #p_w_picpath_filter resize 480 -; #p_w_picpath_filter_jpeg_quality 50; #p_w_picpath_filter_sharpen 10; #p_w_picpath_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 ??? {
}
路徑優先級 (與代碼所在先後順序無關,只與規則有關)
1. = /error.html
2. ^~ /images/
3. ~* \.(gif|jpg|jpeg|png|bmp|swf)$
4. /static/
5. /
解釋:
1.表示完整匹配,用=和徹底的路徑匹配,好比 =/error.html 就匹配 error.html =/ 匹配根路徑
2.表示開頭等於,優先級第二,越長就越能匹配,好比^~ /abc/cd ^~/abc 第一個會優先匹配/abc/cd/xxx
3.表示不區分大小的正則,而且正則中含義是.jpg等結尾的,優先級第三,一樣正則越長越高。
4.表示開頭等於/static/的,可是優先級比第二種低,是一種其餘配置找不到再找它,越長就越能匹配。
5.由於4說了是越長越能匹配,當能匹配/static/就不會匹配/,而/是全部其餘的一個默認匹配。
特別補充好比:location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ { //注意正則與其餘符號要空格,其餘一些配置也是如是。
參考官方文檔:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html