Nginx:Nginx limit_req limit_conn限速


簡介

  • 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服務如下

img-w500

ab壓測獲取基礎數據

105 ab壓測結果

對web服務器index.html頁面發送並發為1000總計1000000的請求測試,每個請求建立一個連接
ab -n 1000000 -c 1000 http://192.168.30.106:80/index.html
img-w500
從測試結果來看,請求全部成功;有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
img-w500

從測試結果來看,請求全部成功;有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
img-w500
從測試結果來看,請求只有55個成功。

測試效果

有效的阻止了用戶的請求。

測試過程web服務資源使用情況監控

CPU利用
img-w500

網絡接口流量
img-w500

TCP連接數狀態
img-w500

總結

  • 從測試的結果以及監控數據來看,limit_conn模塊無效,不能起到任何限制作用;limit_req模塊能夠明顯限制用戶的請求內容,對於超出限制的請求,給予503的反饋;兩者對服務器性能上都沒有優化作用,拒絕的請求需要花費更多的硬件資源來處理,CPU消耗增多,接口流出的流量劇增。
  • 測試結果不是很理想,對於文中的錯誤和不足,歡迎有見識的小伙伴批評指教。

參考文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM