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