nginx可以通過ngx_http_limit_conn_module和ngx_http_limit_req_module配置來限制ip在同一時間段的訪問次數. ngx_http_limit_conn_module:該模塊用於限制每個定義的密鑰的連接數,特別是單個IP地址的連接數.使用limit ...
nginx可以通過ngx_http_limit_conn_module和ngx_http_limit_req_module配置來限制ip在同一時間段的訪問次數.
ngx_http_limit_conn_module:該模塊用於限制每個定義的密鑰的連接數,特別是單個IP地址的連接數.使用limit_conn_zone和limit_conn指令.
ngx_http_limit_req_module:用於限制每一個定義的密鑰的請求的處理速率,特別是從一個單一的IP地址的請求的處理速率。使用“泄漏桶”方法進行限制.指令:limit_req_zone和limit_req.
ngx_http_limit_conn_module:限制單個IP的連接數示例:
http { limit_conn_zone $binary_remote_addr zone=addr:10m; #定義一個名為addr的limit_req_zone用來存儲session,大小是10M記憶體, #以$binary_remote_addr 為key, #nginx 1.18以後用limit_conn_zone替換了limit_conn, #且只能放在http{}代碼段. ... server { ... location /download/ { limit_conn addr 1; #連接數限制 #設置給定鍵值的共用記憶體區域和允許的最大連接數。超出此限制時,伺服器將返回503(服務臨時不可用)錯誤.
#如果區域存儲空間不足,伺服器將返回503(服務臨時不可用)錯誤
}
可能有幾個limit_conn
指令,以下配置將限制每個客戶端IP與伺服器的連接數,同時限制與虛擬伺服器的總連接數:
http { limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m ... server { ... limit_conn perip 10; #單個客戶端ip與伺服器的連接數. limit_conn perserver 100; #限制與伺服器的總連接數 }
參考文檔:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
ngx_http_limit_req_module:限制某一時間內,單一IP的請求數.示例:
http { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ... #定義一個名為one的limit_req_zone用來存儲session,大小是10M記憶體,
#以$binary_remote_addr 為key,限制平均每秒的請求為1個,
#1M能存儲16000個狀態,rete的值必須為整數,
server { ... location /search/ { limit_req zone=one burst=5;
#限制每ip每秒不超過1個請求,漏桶數burst為5,也就是隊列.
#nodelay,如果不設置該選項,嚴格使用平均速率限制請求數,超過的請求被延時處理.
#舉個慄子:
#設置rate
=
20r
/
s每秒請求數為20個,漏桶數burst為5個,
#brust的意思就是,如果第1秒、2,3,4秒請求為19個,第5秒的請求為25個是被允許的,可以理解為20+5
#但是如果你第1秒就25個請求,第2秒超過20的請求返回503錯誤.
#如果區域存儲空間不足,伺服器將返回503(服務臨時不可用)錯誤
#速率在每秒請求中指定(r/s)。如果需要每秒少於一個請求的速率,則以每分鐘的請求(r/m)指定。
}
還可以限制來自單個IP地址的請求的處理速率,同時限制虛擬伺服器的請求處理速率:
http { limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s; limit_req_zone $server_name zone=perserver:10m rate=10r/s; ... server { ... limit_req zone=perip burst=5 nodelay; #漏桶數為5個.也就是隊列數.nodelay:不啟用延遲. limit_req zone=perserver burst=10; #限制nginx的處理速率為每秒10個 }
參考文檔:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html