nginx 限制並發訪問及請求頻率


0.

 

1.參考

【工作】Nginx限制IP並發連接數和請求數的研究

Module ngx_http_limit_conn_module

Module ngx_http_limit_req_module

漏桶算法和 NGINX 的 limit_req 模塊

漏桶這個名字,其實就非常形象的描述了算法本身的原理。大家都知道,一個身上打了 n 個眼兒的桶,無論你倒進桶里的水多還是少,漏出來的水的流速也會保持穩定,這就是此算法的本質。再以 NGINX + PHP-FPM 為例,我們在 NGINX 配置里定義一個最大處理請求的速度,如果 PHP-FPM 的穩定處理速度峰值是 1000 RPS,那就在 NGINX 里定義處理請求速度最大為 1000 RPS。當 RPS 已經大於這個值的時候,多出來的請求就被 NGINX 這個桶暫時儲存起來,排着隊等待處理。在 NGINX 的精心照料下,PHP-FPM 會相對穩定的處理來自 NGINX 的請求,而不會出現突然暴增的請求讓 PHP-FPM 處理不過來,甚至掛掉。

然而桶也有大小,NGINX 也一樣,假如請求太多太多,桶都裝不下了,那么桶將會把多出來的請求直接漏掉,返回 503 錯誤。

 

php-fpm 與 Nginx優化總結

最大請求數max_requests

最長執行時間request_terminate_timeout

2.vi /etc/nginx/nginx.conf

在 http{} 添加:

    ## 2017-12-18 【工作】Nginx限制IP並發連接數和請求數的研究 http://www.jiagoumi.com/work/718.html
    #調整為1,nginx -t 檢查,再reload,查看 error.log
    #默認為503 Service Unavailable,由於臨時的服務器維護或者過載,
    #可以429 Too Many Requests 用戶在給定的時間內發送了太多的請求
    
    # [error] limiting connections by zone "conn_ip"
    limit_conn_zone $binary_remote_addr zone=conn_ip:10m;
    limit_conn conn_ip 10;  #如果這里設置為限制1個ip只能1個連接,log 顯示 req_freq_ip 相關控制信息
    
    # [error] limiting connections by zone "conn_server"
    limit_conn_zone $server_name zone=conn_server:10m;
    limit_conn conn_server 1000;
    
    
    limit_req_zone  $binary_remote_addr zone=req_freq_ip:10m rate=3r/s;
    #這樣相當於容量為0,都會被503,沒有意義
    #limit_req zone=req_freq_ip;  #By default, the maximum burst size is equal to zero
    
    #超過每秒3個請求,放入最多容納10個的緩沖區,或者理解為10個令牌?
    #超過3.x,則log顯示 [warn] delaying; 超過10.x,則log顯示 [error] limiting, 會被503
    limit_req zone=req_freq_ip burst=10;
    
    #后面加 nodelay 則未超過10.x的拿到令牌的請求不會被延遲
    #limit_req zone=req_freq_ip burst=10 nodelay;  
    
    limit_req_status 429;
    
    
    limit_conn_log_level error;  #info | notice | warn | error 不支持 debug

 

 

 

3.這里打開一個網頁,實際上建立了多個連接,其中也包括連接復用。

 


免責聲明!

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



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