nginx輕巧功能強大,能承受幾百并發(fā)量,ddos攻擊幾乎沒有影響到nginx自身的工作,但是,太多的請求就開始影響后端服務了。所以必須要在nginx做相應的限制,讓攻擊沒有到后端的服務器。這里闡述的是能在單位時間內限制請求數(shù)的ngx_http_limit_req_module模塊和nginx限制連接數(shù)的ngx_http_limit_conn_module模塊。安裝模塊這些簡單的步驟這里就不介紹了,就介紹一下配置的參數(shù),希望對大家有用。
一、nginx限制請求數(shù)ngx_http_limit_req_module模塊
1、鍵值的定義,就是限制的參數(shù)。這個在http里面設置。
limit_req_zone
語法: limit_req_zone $variable zone=name:size rate=rate;
默認值: none
配置段: http
例子:limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
說明:區(qū)域名稱為one,大小為10m,平均處理的請求頻率不能超過每秒一次。
鍵值是客戶端IP。
使用$binary_remote_addr變量, 可以將每條狀態(tài)記錄的大小減少到64個字節(jié),這樣1M的內存可以保存大約1萬6千個64字節(jié)的記錄。
如果限制域的存儲空間耗盡了,對于后續(xù)所有請求,服務器都會返回 503 (Service Temporarily Unavailable)錯誤。
速度可以設置為每秒處理請求數(shù)和每分鐘處理請求數(shù),其值必須是整數(shù),所以如果你需要指定每秒處理少于1個的請求,2秒處理一個請求,可以使用 “30r/m”。
2、設置你所希望的日志級別。
limit_req_log
語法: limit_req_log_level info | notice | warn | error;
默認值: limit_req_log_level error;
配置段: http, server, location
當服務器因為頻率過高拒絕或者延遲處理請求時可以記下相應級別的日志。 延遲記錄的日志級別比拒絕的低一個級別;比如, 如果設置“l(fā)imit_req_log_level notice”, 延遲的日志就是info級別。
3、設置錯誤返回值。
語法: limit_req_status code;
默認值: limit_req_status 503;
配置段: http, server, location
該指令在1.3.15版本引入。設置拒絕請求的響應狀態(tài)碼。
4、設置對應的共享內存限制域和允許被處理的最大請求數(shù)閾值。
語法: limit_req zone=name [burst=number] [nodelay];
默認值: —
配置段: http, server, location
limit_req_zone $binary_remote_addr zone=ttlsa_com:10m rate=1r/s;
server {
location /www.ttlsa.com/ {
limit_req zone=ttlsa_com burst=5;
}
}
限制平均每秒不超過一個請求,同時允許超過頻率限制的請求數(shù)不多于5個。
如果不希望超過的請求被延遲,可以用nodelay參數(shù),如:
limit_req zone=ttlsa_com burst=5 nodelay;
二、nginx限制連接數(shù)ngx_http_limit_conn_module模塊
1、用于限制每個已定義鍵的連接數(shù)特別是來自單個IP地址的連接數(shù)。并不是所有的連接都被計算在內。只有當服務器處理了一個請求,并且整個請求頭已經被讀取時,才會計算連接。
limit_conn_zone
語法: limit_conn_zone $binary_remote_addr zone=addr:10m;
默認值: none
配置段: http
例子:limit_conn_zone $binary_remote_addr zone=addr:10m;
說明:區(qū)域名稱為addr,大小為10m,鍵值是客戶端IP。
如果限制域的存儲空間耗盡了,對于后續(xù)所有請求,服務器都會返回 503 (Service Temporarily Unavailable)錯誤。
2、設置允許一個IP同時的連接數(shù)。
limit_conn
語法: limit_conn zone number;
默認值: none
配置段:http, server, location
例子:
limit_conn_zone $binary_remote_addr zone=addr:10m; server { location /download/ { limit_conn addr 1; }
設置了內存空間的連接數(shù),一旦超過,將會返回錯誤代碼。一個IP同時只允許一個連接。
此指令的第二種用法,設置虛擬主機同時的鏈接總數(shù)限制。
例子:
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
...
limit_conn perip 10;
limit_conn perserver 100;
先設置內存共享空間,再針對內存共享空間做限制。
3、設置日志指令等級。
語法: limit_conn_log_level info | notice | warn | error;
默認: limit_conn_log_level error;
配置段: http, server, location
4、設置錯誤返回的代碼。
語法: limit_conn_status code;
默認: limit_conn_status 503;
配置段: http, server, location
|
|