簡介
- Nginx是一個異步框架的Web服務器,也可以用作反向代理,負載均衡器和HTTP緩存,最常用的便是Web服務器。nginx對于預防一些攻擊也是很有效的,例如CC攻擊,爬蟲,本文將介紹限制這些攻擊的方法,可以使用nginx的ngx_http_limit_conn_module、ngx_http_limit_req_module這兩個模塊達到目的,該模塊為nginx內置模塊,yum安裝即有,無需編譯安裝。本文就介紹nginx這兩個模塊的使用和細節,希望能夠對需要的小伙伴有所幫助。
基本環境介紹
- 兩臺機器,192.168.30.105和192.168.30.106均為 1c2g40g配置,106主機提供web服務,105主機部署ab工具。
web服務如下
ab壓測獲取基礎數據
105 ab壓測結果
對web服務器index.html頁面發送并發為1000總計1000000的請求測試,每個請求建立一個連接
ab -n 1000000 -c 1000 http://192.168.30.106:80/index.html
從測試結果來看,請求全部成功;有98%的請求在22ms以內就完成響應,有99%的請求在1007ms以內就完成響應,請求響應的最長時長為31077ms。
nignx ngx_http_limit_conn_module模塊
- 該模塊的功能是限制單個ip建立連接的個數。
對nginx進行配置
http {limit_conn_zone $binary_remote_addr zone=one:10m;...server {...location / {limit_conn one 1;}
限制每個ip連接的個數為一個
測試
對web服務器index.html頁面發送并發為1000總計1000000的請求測試
ab -n 1000000 -c 1000 http://192.168.30.106:80/index.html
從測試結果來看,請求全部成功;有98%的請求在58ms以內就完成響應,有99%的請求在1008ms以內就完成響應,請求響應的最長時長為31870ms。
測試效果
測試結果無變化,查眾多文檔,有問題,無答案,估計是個bug。
nignx ngx_http_limit_req_module模塊
- 該模塊的功能是限制單個ip請求的個數(請求頻率)。
對nginx進行配置
去掉之前limit_conn 配置,添加如下配置
http {limit_req_zone $binary_remote_addr zone=two:10m rate=1r/s;...server {...location / {limit_req zone=two;}
限制請求的頻率為單個ip每秒一個
測試
對web服務器index.html頁面發送并發為1000總計1000000的請求測試
ab -n 1000000 -c 1000 http://192.168.30.106:80/index.html
從測試結果來看,請求只有55個成功。
測試效果
有效的阻止了用戶的請求。
測試過程web服務資源使用情況監控
CPU利用
網絡接口流量
TCP連接數狀態
總結
- 從測試的結果以及監控數據來看,limit_conn模塊無效,不能起到任何限制作用;limit_req模塊能夠明顯限制用戶的請求內容,對于超出限制的請求,給予503的反饋;兩者對服務器性能上都沒有優化作用,拒絕的請求需要花費更多的硬件資源來處理,CPU消耗增多,接口流出的流量劇增。
- 測試結果不是很理想,對于文中的錯誤和不足,歡迎有見識的小伙伴批評指教。
參考文檔
- 官方文檔:http://nginx.org/en/docs
- 使用nginx limit_req限制用戶請求速率:https://www.centos.bz/2017/03/using-nginx-limit_req-limit-user-request-rate
- 關于limit_req和limit_conn的區別:https://blog.csdn.net/u012566181/article/details/49968283
- ab壓力測試報錯:https://www.cnblogs.com/felixzh/p/8295471.html
- ab性能測試結果分析:https://www.cnblogs.com/gumuzi/p/5617232.html
- Rate Limiting with NGINX and NGINX Plus:https://www.nginx.com/blog/rate-limiting-nginx/