Nginx何防止流量攻擊,大部分程序員都收藏了...
兩種實現(xiàn)方式分別是基于Ehcache和Redis的session管理策略。
大家都知道服務(wù)器資源有限的,但是客戶端來的請求是無限的(不排除惡意攻擊), 為了保證大部分的請求能夠正常響應(yīng),不得不放棄一些客戶端來的請求,所以我們會采用Nginx的限流操作, 這種操作可以很大程度上緩解服務(wù)器的壓力, 使其他正常的請求能夠得到正常響應(yīng)。
如何使用Nginx實現(xiàn)基本的限流,比如單個IP限制每秒訪問100次。通過Nginx限流模塊,我們可以設(shè)置一旦并發(fā)連接數(shù)超過我們的設(shè)置,將返回503錯誤給客戶端。這樣可以非常有效的防止CC攻擊。再配合 iptables防火墻,基本上CC攻擊就可以無視了。
如何使用
conf配置
- #統(tǒng)一在http域中進行配置
- #限制請求
- limit_req_zone $binary_remote_addr $uri zone=api_read:20m rate=100r/s;
- #按ip配置一個連接 zone
- limit_conn_zone $binary_remote_addr zone=perip_conn:10m;
- #按server配置一個連接 zone
- limit_conn_zone $server_name zone=perserver_conn:100m;
- server {
- listen 80;
- server_name test.domain.com;
- index login.do;
- location / {
- #請求限流排隊通過 burst默認是0
- limit_req zone=api_read burst=5;
- #連接數(shù)限制,每個IP并發(fā)請求為2
- limit_conn perip_conn 2;
- #服務(wù)所限制的連接數(shù)(即限制了該server并發(fā)連接數(shù)量)
- limit_conn perserver_conn 1000;
- #連接限速
- limit_rate 100k;
- proxy_pass http://test;
- }
- }
- upstream report {
- fair;
- server 172.16.0.10:8882 weight=1 max_fails=2 fail_timeout=30s;
- server 172.16.0.10:8881 weight=1 max_fails=2 fail_timeout=30s;
- }
配置503錯誤
默認情況,超出限制額度,將會報503錯誤,提示:
- 503 Service Temporarily Unavailable
- The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later. Sorry for the inconvenience.
- Please report this message and include the following information to us.
- Thank you very much!
這樣顯示沒毛病,但是不夠友好,這里我們自定義503錯誤。
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root html;#自定義50X錯誤
- }
配置說明
limit_conn_zone
是針對每個IP定義一個存儲session狀態(tài)的容器。這個示例中定義了一個100m的容器,按照32bytes/session,可以處理3200000個session。
limit_rate 300k;
對每個連接限速300k. 注意,這里是對連接限速,而不是對IP限速。如果一個IP允許兩個并發(fā)連接,那么這個IP就是限速limit_rate×2。
burst=5;
這相當(dāng)于在檢查站req旁邊放5個座位。如果某個請求當(dāng)時超過速度限制被攔了,請他在空座位上坐著,等排隊,如果檢查站空了,就可以通過。如果連座位都坐滿了,那就抱歉了,請求直接退回,客戶端得到一個服務(wù)器忙的響應(yīng)。所以說burst跟request_rate一點關(guān)系都沒有,設(shè)成10000,就是1萬個請求可以等著排隊,而檢查站還是1秒鐘放行5個請求(龜速)。而且也不能一直排隊,所以nginx還設(shè)了超時,排隊超過一定時間,也是直接退回,返回服務(wù)器忙的響應(yīng)。
以上配置Nginx需要配置以下模塊:
ngx_http_limit_conn_module (static)
ngx_http_limit_req_module (static)
執(zhí)行命令 nginx -V 就可以檢查到是否有安裝。