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.这里打开一个网页,实际上建立了多个连接,其中也包括连接复用。

 

posted @ 2017-12-18 15:22  my8100  阅读(16991)  评论(0编辑  收藏  举报