1. 程式人生 > >nginx 限制並發訪問及請求頻率

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

con com div 就是 col nat 執行 ice del

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.這裏打開一個網頁,實際上建立了多個連接,其中也包括連接復用。

技術分享圖片

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