前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nginx请求连接限制笔记

nginx请求连接限制笔记

作者头像
我的小碗汤
发布2018-08-22 10:37:31
6850
发布2018-08-22 10:37:31
举报
文章被收录于专栏:我的小碗汤

之前也有写过有关于爬虫的实战练习:go语言爬取珍爱网

当时爬取时当并发过大的时候,请求就会出现卡死的情况。其实这可能就是珍爱网对请求和连接进行了限制。

爬虫和反爬是个“一边攻,一边守”的技术,但我们亲爱的爬虫工程师们也一直遵守着“只攻不破”的原则。网站服务器对爬虫一直在做限制,避免服务器流量异常,负载过大,防止恶意的攻击带来带宽和资源的浪费,甚至影响业务正常运行。往往办法是限制对同一个IP的连接数和并发数进行限制。今天我们就来看看nginx的连接频率limit_conn_module和请求频率limit_req_module 限制模块。

HTTP请求建立在一次TCP连接基础上,一次TCP请求至少产生一次HTTP请求。

连接限制:

语法如下:

代码语言:javascript
复制
Syntax:limit_conn_zone key zone=name:size;   
Default: -
Context:http

limit_conn_zone:一块空间,用于存放被限制连接的状态;

key:键,可以说是一个规则,就是对客服端连接的一个标识,比如可以用内置变量 — 客户端的ip;

zone:就是这块空间的名字,这个需要和location的配置相对应;

size:就是申请空间的大小。

limit_conn指令:

代码语言:javascript
复制
Syntax: limit_conn zone number;
Default: -
Context: http, server, location

这里有个前提必须在http下先定义好limit_conn_zone才可以在这里引用。

这里的zone就是上面zone的名字,number就是同一时间连接的限制数。

请求频率限制:

代码语言:javascript
复制
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: -
Context: http

语法和上面类似,rate为速率限制,以秒为单位多少个。

limit_req指令:

代码语言:javascript
复制
Syntax: limit_req zone=name [burst=number] [nodelay]

Default: -

Context: http,server,location

burst=number,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为number的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内,起到访问限速的作用

nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503(Service Temporarily Unavailable)服务暂时不可用,如果没有设置,则所有请求会等待排队。

这两个默认是不需要配置的。

配置示例如下:

$binary_remote_addr表示二进制的IP地址,一个二进制的ip地址在32位机器上占用32个字节,那么1M可以存放多少呢,计算一下,1x1024x1024/32 = 32768,意思就是可以存放32678个ip地址,在一个会话中,比$remote_addr要节约10空间;

rate=1r/s表示每秒只能有一个请求;

1、

把location下的limit配置都注释掉,用ab工具(压力测试工具)测试:

代码语言:javascript
复制
ab -n10000 -c1000 http://192.168.1.6/index.html

这里-n表示请求总数,-c表示同一时间的请求数。

请求之后所有请求都成功:

2、

当只放开limit_req zone=req_zone;注释后,用压测工具ab发起同样的命令后:

可以看到只成功请求3个,因为req_zone配置的rate为每秒一个请求。

3、

当只放开location下limit_req zone=req_zone burst=3 nodelay;注释时,继续发起请求:

可以看到,成功了6个,比上一次多了3个。burst=3将3个请求放到缓冲区等下一秒执行。

4、

当只放开limit_conn conn_zone 1;注释时,使用ab进行测试。此时一个ip只能同一时刻只能建立一个连接。

本文由“壹伴编辑器”提供技术支持

最后我为大家收集了些学习资料,如果你准备入IT坑,励志成为优秀的程序猿,那么这些资源很适合你,包括javagopythonspringcloudelk、嵌入式 、大数据、面试资料、前端 等资源。同时我们组建了一个技术交流群,里面有很多大佬,会不定时分享技术文章,如果你想来一起学习提高,可以公众号后台回复【加群】,免费邀请加技术交流群,并获取对应资源,期待你的到来!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • limit_conn指令:
  • 这里有个前提必须在http下先定义好limit_conn_zone才可以在这里引用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档