首页 > 系统相关 >Nginx与LUA(3)

Nginx与LUA(3)

时间:2023-01-15 23:31:10浏览次数:39  
标签:令牌 ab 请求 zone LUA server Nginx localhost

您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~




在互联网应用中,很多场景都会涉及到高并发请求,如果不对这些请求做限制,那么服务器很快就会被挤垮。就像在12306买票一样,如果全国人民都去抢票,服务器是无论如何也扛不住压力的。

这是非常现实的而且也是必须要解决的问题。

其实,除了反向代理和负载均衡,网络限流也是Nginx的拿手好戏。

常用于实现网络限流的两类算法有:

1、令牌桶;

2、漏桶。

而Nginx实现限流的两种方式是:

1、限制访问频率,就是限制指定时间内每个用户的访问次数;

2、限制并发连接数,就是限制某段时间内访问资源的用户数。

Nginx限流模块使用的是漏桶算法。

令牌桶限流的算法思想是:

1、令牌以固定速率产生,并缓存到令牌桶;

2、令牌桶放满时,多余的令牌将被直接丢弃;

3、请求进来时,先进入待处理的请求队列;

4、处理请求时需要从桶里拿到相应数量的令牌作为处理「凭证」;

5、当桶里没有令牌时,请求处理被拒绝。

令牌桶是一种常用于网络流量整形和速率限制的算法,只有持有令牌的请求才会被处理,这也是令牌桶名称的由来。令牌桶算法允许突发流量的存在,更适合会有突发流量的场景。

Nginx与LUA(3)_限流


而漏桶限流的算法思想是:

水(请求)从上方进入水桶,从下方流出(被处理),来不及流出的水存在水桶中(缓冲),以固定速率流出。水桶满后水溢出(丢弃请求)。漏桶也是一种常用的整形和限速算法,其核心是缓存请求、匀速处理、多余丢弃。

正如漏桶一样,不管突然增加多少水量,底部的漏洞始终保持着匀速的出水量,这正是漏桶算法名称的由来。因此漏桶算法会屏蔽突发请求,更适合需要平滑流量的场景。

Nginx与LUA(3)_Nginx_02


漏桶算法与令牌桶算法看起来很类似,容易弄混。实际上这两者具有截然不同的特性,应用在不同的场景中。真正区分令牌桶和漏桶最核心的特征是「变速」和「匀速」:

1、令牌桶是一种变速运动——就像高速上的汽车一样;

2、漏桶是一种匀速运动——就像铁轨上的火车一样。

这两种限流算法没有优劣好坏之分,只区分场景的适用性。


为了验证这两种县里算法,可以做一个简单的测试。ab是apachebench命令的缩写,是一款比较优秀的压测工具。在安装Nginx的机器上安装ab,如果不想安装apache但是又想使用ab命令的话,可以这样做:

yum -y install httpd-tools

cd /usr/bin

ab -V

ab的使用也很简单:

./ab -h:获取帮助

./ab -n1000 -c100 -t1 -s5 http://localhost/test?username=test1

意思是:发送1000次,每次100个并发请求到指定服务,并在1秒之内完成请求,超时时间5秒。如果只是-n100、-c10参数,只能看到总的请求次数100次,看不到并发请求环境下是否真的满足限流要求。

如果加上-t、-s参数,就能很清楚地看到限流效果。

ab测试完成后的结果可能是这个样子的:

Nginx与LUA(3)_Nginx_03


用Nginx限制访问速率可以这样写:限制每个IP的访问速率为每秒10次。

limit_req_zone $binary_remote_addr zone=case1:10m rate=10r/s;

server {

    listen       80;

    server_name  localhost;

    location / {

        limit_req zone=case1;

    }

}


ab测试命令:

./ab -n100 -c10 -t1 -s5 http://localhost/test?username=test1

./ab -n100 -c10 -t2 -s5 http://localhost/test?username=test1(多线程影响)

结果满足要求:

Complete requests:30397;Failed requests:30387


用Nginx限制突发增量可以这样写:限制每个IP的访问速率为每秒10次,有burst且直接返回。

limit_req_zone $binary_remote_addr zone=case1:10m rate=10r/s;

server {

    listen       80;

    server_name  localhost;

    location / {

        limit_req zone=case1 burst=5 nodelay;

    }

}


ab测试命令:

./ab -n100 -c10 -t1 -s5 http://localhost/test?username=test1

./ab -n100 -c10 -t2 -s5 http://localhost/test?username=test1(多线程影响)

结果观察:

Complete requests:15212;Failed requests:15197


用Nginx限制并发访问:限制每个IP的并发请求为10。

limit_conn_zone $binary_remote_addr zone=case2:10m;

server {

    listen       80;

    server_name  localhost;

    location / {

        limit_conn case2 10;

    }

}


ab测试命令:

./ab -n100 -c10 -t1 -s5 http://localhost/test?username=test1

./ab -n100 -c11 -t1 -s5 http://localhost/test?username=test1

结果观察:

当参数为c10,所有请求全部成功;当参数为c11,出现请求失败的情况


限制并发访问:按服务名。

限制每个服务的并发请求为10

limit_conn_zone $server_name zone=case3:10m;

server {

    listen       80;

    server_name  localhost;

    location / {

        limit_conn case3 10;

    }

}


ab测试命令:

./ab -n100 -c10 -t1 -s5 http://localhost/test?username=test1

./ab -n100 -c11 -t1 -s5 http://localhost/test?username=test1

结果观察:

当参数为c10,所有请求全部成功;当参数为c11,出现请求失败的情况


还可以自定义返回值:配置status返回值

limit_req_zone $binary_remote_addr zone=case1:10m rate=10r/s;

server {

    listen       80;

    server_name  localhost;

    location / {

        limit_conn case1 10;

        limit_req_status 599;

    }

}


ab测试命令:

./ab -n100 -c10 -t1 -s5 http://localhost/test?username=test1

ab看不到效果,需要用其他更专业测试工具,比如Postman。





感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

标签:令牌,ab,请求,zone,LUA,server,Nginx,localhost
From: https://blog.51cto.com/u_15817148/6008926

相关文章

  • Nginx与LUA(3)
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   在互联网应用中,很多场景都会涉及到高并发请求,如果不对这些请求做限制,那么服务器很快就会被挤垮。就像在12306买......
  • nginx配置安全漏洞之CRLF注入漏洞
    CRLF漏洞原理参考:https://www.leavesongs.com/PENETRATION/Sina-CRLF-Injection.htmlCRLF是”回车+换行”(\r\n)的简称。在HTTP协议中,HTTPHeader与HTTPBody是用两个CRL......
  • nginx开机启动脚本
    vi/etc/rc.d/init.d/nginx#编辑启动文件添加下面内容=======================================================#!/bin/sh##nginx-thisscriptstartsandstopst......
  • 使用docker中的nginx实现反向代理
    场景:宿主机有个目录存储静态资源,需要通过nginx代理出去,用户访问http://host:port/resource/xxxx访问。   1、修改宿主机中的/nginx/conf.d/default.conf文件(该文......
  • docker中离线安装nginx
    注:默认已经安装好docker。 为什么要离线安装?其实离线安装是建立在在线安装的基础上的;因为有可能我们的服务器由于安全问题无法访问外网,自此我们需要将镜像手动上传至服......
  • kubernetes安装ingress-nginx的步骤
    kubernetes安装ingress-nginx的步骤系统版本:CentOs8.1k8s版本:v1.21.3containerd版本:ctrcontainerd.io1.4.3一:准备yaml文件github仓库地址:wgethttps://raw.githubuse......
  • 为什么推荐大家使用 Nginx 而不是 Apache?
    无论是Nginx还是Apache都是Web服务器应用,通俗点说我们的网站都是需要Web服务器应用来展现给客户的,而服务器是供Web服务器应用正常稳定的运行的基础。所以说选择好......
  • nginx内置参数
    $args#请求中的参数值$query_string#同$args$arg_NAME#GET请求中NAME的值$is_args#如果请求中有......
  • nginx 统计UV PV IP等
    cat/var/log/nginx/access.log1.根据访问IP统计UVawk'{print$1}' /var/log/nginx/access.log|sort|uniq-c|wc-l2.统计访问URL统计PVawk'{print$7}'/var/log/ng......
  • windows下快速安装nginx并配置开机自启动的方法
    目录一、windows系统下Nginx安装启动流程:二、设置Nginx开机自动启动1、自启动工具下载2、自启动工具安装3、把nginx加入到windows服务中nginx已经是我们日常开发中在常用不......