1. 程式人生 > >nginx的限流問題

nginx的限流問題

host 超時 sock 客戶 服務器 tle style index 代碼

http{

limit_req_zone $binary_remote_addr zone=req_one:10m rate=100r/s;
server
{

listen 8080;
server_name localhost;
location /server1/ {
limit_req zone=req_one burst=10;
}

}
}

解釋:

rate=100r/s 意思是每個地址每秒只能請求100次。

burst=10 表示 一共有10塊令牌,並且每秒鐘只新增1塊令牌。

可以參考以下例子:

nginx利用limit模塊設置IP並發防CC攻擊
在nginx.conf 中的http字段下面加入一如下一行
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; ##平均 1r/s 每秒1個請求

再在server下配置的主機定義文檔中加入如下一行(全局就加在server下面)
limit_req zone=one burst=8;隊列模式
limit_req zone=one burst=8 nodelay; ###不用隊列 默認的突發(burst是0)

如果只想限制php的請求,加在location下

location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
limit_req zone=one burst=8 nodelay;

重加載nginx即可 nginx -s reload

參考文檔1:http://www.howtoforge.com/rate-limiting-with-nginx
參考文檔2:http://wiki.nginx.org/NginxHttpLimitReqModule:

比如nginx.conf的http段配置如下

  1. limit_req_zone $binary_remote_addr zone=req:20m rate=100r/s;
  2. limit_req zone=req burst=150;
復制代碼

“limit_req_zone $binary_remote_addr zone=req:20m rate=100r/s;”
相當於在nginx創建了一個檢查站,名字叫req,凡是跟req相關的請求,並限定檢查速率是100r/s。
所以當使用“limit_req zone=req
burst=150;”指定某些請求需要經過req的時候,請求的速率就被限制為100r/s。日誌驗證了這點。

然後就是burst=150了。這相當於在檢查站req旁邊放150個座位。如果某個請求當時超過速度限制被攔了,請他在空座位上坐著,等排隊,如果檢查站空了,就可以通過。如果連座位都坐滿了,那就抱歉了,請求直接退回,客戶端得到一個服務器忙的響應。所以說burst跟request_rate一點關系都沒有,設成10000,就是1萬個請求可以等著排隊,而檢查站還是1秒鐘放行100個請求(龜速)。而且也不能一直排隊,所以nginx還設了超時,排隊超過一定時間,也是直接退回,返回服務器忙的響應。

轉載:https://www.cnblogs.com/gradven/p/4962982.html

nginx的限流問題