nginx限制ip訪問頻率的實現示例
Nginx通過limit_conn_zone 和 limit_req_zone對同一個IP地址進行限速限流,可防止DDOS/CC和flood攻擊 。
limit_conn_zone是限制同一個IP的連接數。而一旦連接建立之后 。客戶端就會通過這次的連接發送多次請求,那么在此期間的請求頻率和速度進行限制就需要limit_req_zone
limit_conn_zone配置連接數限制,相當于限制了nginx與客戶端之間的管道個數
http區塊的配置:
limit_conn_zone $binary_remote_address zone=asia; 10m;# 這個配置的意思就是定義一個名為 asia的limit_conn_zone用來存儲session # 內存為10m大小server區塊配置如下;
limit_conn asia 2;# 單個客戶端ip與服務器的連接數limit_req_zone配置:請求頻率 限制,相當于限制了nginx與客戶端管道之間水的流速
http區塊配置:
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;server區塊配置:
limit_req_zone=one burst=10;burst漏桶原理
rate=5r/s :從單一IP地址每秒5個請求是允許的
burst=10:允許超過頻率rate限制的請求數不多于10個
當每秒請求超過5個 但是在10個以下,也就是每秒請求的數量在5-10之間的請求將被延時delay,雖然沒有明確的定義delay,默認就是延時的,因為漏桶其實類似隊列Queue或消息系統,
當每秒請求數量超過最低速率每5個請求時,多余的請求將會進入這個隊列排隊等待。如同機場安檢,一次放入5個 。多余5個 。小于10個排隊等待
注:這里的隊列或者漏桶是以秒為單位的
如果每秒的請求超過10個 ,也就是超出了burst的限制 。那么也不用排隊,而是直接回絕返回 503錯誤(Service Temporarily Unavailable 服務暫時不可用)
如果我們使用nodelay:
limit_req zone=one burst=10 nodelay;這表示,如果每秒請求在5-10個之間會盡快完成,也就是以每秒10個速率完成,超過每秒10+5也就是15個就立即返回503,因此nodelay實際沒有了延時,也就取消了隊列等候過渡。
在Twitter Facebook LinkedIn這類大型網站中,由于訪問量巨大,通常會在http服務器后面放置一個消息隊列,比如Apache Kafka,用來排隊大量請求,因此,對于中小型網站,推薦使用delay方案,而不要寫明nodelay,但是網絡上其他各種文章幾乎都是推薦nodelay.
防止POST攻擊:上面總結了三個限速限流設置方式,還有一種能夠防止POST攻擊,黑客通過發出大量POST請求對網站各種URL進行試探攻擊,可以通過下面方式防止
http {... #nginx.conf 配置#如果請求類型是POST 將ip地址映射到 $limit 值map $request_method $limit {default '';POST $binary_remote_addr;}#創造10mb zone內存存儲二進制iplimit_req_zone $limit zone=my_zone:10m rate=1r/s;}帶寬限制:limit_rate 50k;limit_rate_after 500k;當下載的大小超過500k以后,以每秒50K速率限制。
示例
location /flv/ { flv; limit_rate_after 500k; limit_rate 50k;}來源Nginx 限制ip的訪問頻率 (qq.com)
到此這篇關于nginx限制ip訪問頻率的實現示例的文章就介紹到這了,更多相關nginx限制ip訪問頻率內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!
