Nginx學習筆記:如何防止流量攻擊

Nginx Redis 防火牆 技術 雲棲社區 2017-04-29

更多深度文章,請關注雲計算頻道:https://yq.aliyun.com/cloud

使用場景

最近,報告查詢系統負載均衡集群相關配置已經完成,兩種實現方式分別是基於Ehcache和Redis的session管理策略。

大家都知道服務器資源有限的,但是客戶端來的請求是無限的(不排除惡意攻擊), 為了保證大部分的請求能夠正常響應,不得不放棄一些客戶端來的請求,所以我們會採用Nginx的限流操作, 這種操作可以很大程度上緩解服務器的壓力, 使其他正常的請求能夠得到正常響應。

如何使用Nginx實現基本的限流,比如單個IP限制每秒訪問50次。通過Nginx限流模塊,我們可以設置一旦併發連接數超過我們的設置,將返回503錯誤給客戶端。這樣可以非常有效的防止CC攻擊。再配合 iptables防火牆,基本上CC攻擊就可以無視了。

如何使用

conf配置

#統一在http域中進行配置#限制請求limit_req_zone $binary_remote_addr $uri zone=api_read:20m rate=50r/s;#按ip配置一個連接 zonelimit_conn_zone $binary_remote_addr zone=perip_conn:10m;#按server配置一個連接 zonelimit_conn_zone $server_name zone=perserver_conn:100m;server {

配置503錯誤

默認情況,超出限制額度,將會報503錯誤,提示:

503 Service Temporarily Unavailable

這樣顯示沒毛病,但是不夠友好,這裡我們自定義503錯誤。

error_page 500 502 503 504 /50x.html;

配置說明

limit_conn_zone

是針對每個IP定義一個存儲session狀態的容器。這個示例中定義了一個100m的容器,按照32bytes/session,可以處理3200000個session。

limit_rate 300k;

對每個連接限速300k. 注意,這裡是對連接限速,而不是對IP限速。如果一個IP允許兩個併發連接,那麼這個IP就是限速limit_rate×2。

burst=5;

這相當於在檢查站req旁邊放5個座位。如果某個請求當時超過速度限制被攔了,請他在空座位上坐著,等排隊,如果檢查站空了,就可以通過。如果連座位都坐滿了,那就抱歉了,請求直接退回,客戶端得到一個服務器忙的響應。所以說burst跟request_rate一點關係都沒有,設成10000,就是1萬個請求可以等著排隊,而檢查站還是1秒鐘放行5個請求(龜速)。而且也不能一直排隊,所以nginx還設了超時,排隊超過一定時間,也是直接退回,返回服務器忙的響應。

相關推薦

推薦中...