电商平台营销时候,经常会碰到的大流量问题,除了做流量分流处理,可能还要做用户黑白名单、信誉分析,进而根据用户ip信誉权重做相应的流量拦截、限制流量。
Nginx自身有的请求限制模块ngx_http_limit_req_module、流量限制模块ngx_stream_limit_conn_module基于令牌桶算法,可以方便的控制令牌速率,自定义调节限流,实现基本的限流控制。

对于提供下载的网站,肯定是要进行流量控制的,例如软件下载站、视频服务等。
它也可以减少一些爬虫程序或者DDOS的攻击。

对这两个模块的介绍的文章也不少,这里转载一篇hopestar的文章: nginx限制IP连接数的范例参考, 因为他介绍的很简洁。

下面文章的limit_zone指令已经被弃用,请用limit_conn_zone替换


如何Nginx限制同一个ip的连接数,限制并发数目:

限流

(1) 添加limit_zone和limit_req_zone

这个变量只能在http使用 :

1
2
3
vi /export/servers/nginx/conf/nginx.conf
limit_zone one $binary_remote_addr 20m;
limit_req_zone $binary_remote_addr zone=req_one:20m rate=12r/s;

(2) 添加limit_conn 和limit_req

这个变量可以在httpserverlocation使用 我是限制nginx上的所有服务,所以添加到http里面 (如果你需要限制部分服务,可在nginx/conf/domains里面选择相应的server或者location添加上便可)

1
2
3
4
5
6
vi /export/servers/nginx/conf/nginx.conf
 
limit_zone one $binary_remote_addr 20m;
limit_req_zone $binary_remote_addr zone=req_one:20m rate=12r/s;
limit_conn one 10;
limit_req zone=req_one burst=120;

参数详解(数值按具体需要和服务器承载能力设置,):

1
2
3
4
limit_zone,是针对每个变量(这里指IP,即$binary_remote_addr)定义一个存储session状态的容器。这个示例中定义了一个20m的容器,按照32bytes/session,可以处理640000个session。
limit_req_zone 与limit_zone类似。rate是请求频率. 每秒允许12个请求。
limit_conn one 10 : 表示一个IP能发起10个并发连接数
limit_req: 与limit_req_zone对应。burst表示缓存住的请求数。

范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
http
{
limit_zone one $binary_remote_addr 20m;
limit_req_zone $binary_remote_addr zone=req_one:20m rate=12r/s;
limit_conn one 10;
limit_req zone=req_one burst=120;
 
server {
listen 80;
server_name status.xxx.com ;
 
location / {
stub_status on;
access_log off;
}
}
}

(3) 重启nginx

1
/export/servers/nginx/sbin/nginx -s reload

Nginx限制流量/限制带宽 具体参考官方文档

nginx白名单设置

以上配置会对所有的ip都进行限制,有些时候我们不希望对搜索引擎的蜘蛛或者某些自己的代理机过来的请求进行限制, 对于特定的白名单ip我们可以借助geo指令实现。

先在nginx的请求日志进行统计,查看那个ip的访问量比较大, 运行:

1
2
cat access.log | grep "03/Jun" |awk '{print $1}'|sort |uniq -c|sort -nrk 1|head -n 10
#列出访问日志里面在6月3号这天前10个访问量最大的ip.

接下来就可以对这些IP进行分析了。看哪些需要进行白名单设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
http{
geo $limited { # the variable created is $limited
default 1;
127.0.0.1/32 0;
10.12.212.63 0;
}
map $limited $limit {
1 $binary_remote_addr;
0 "";
}
 
limit_zone one $binary_remote_addr 20m;
limit_req_zone $limit zone=req_one:20m rate=20r/s;
limit_conn one 10;
limit_req zone=req_one burst=120;
}

上面两个需要用到map和geo模块,这是nginx自带的模块,有的运维喜欢把他们关闭,自己./sbin/nginx -V 留意一下。把配置的--whithout-XXX-module 去掉重新编译一下就可以了。 上面这段配置的意思是:

1.geo指令定义了一个白名单limited变量,默认值为1,如果客户端ip在上面的范围内,limited变量,默认值为1,如果客户端ip在上面的范围内,limited的值为0
2.使用map指令映射搜索引擎客户端的ip为空串,如果不是搜索引擎就显示本身真实的ip,这样搜索引擎ip就不能存到limit_req_zone内存session中,所以不会限制搜索引擎的ip访问

PS:获取客户端的真实IP

顺带一提,为了获取客户端的真实IP。该模块需要安装read_ip模块,运维应该默认有安装。没有的话也可自行安装: 配置方式相当简单,重新编译 Nginx 加上 --with-http_realip_module 参数,如:

1
2
3
./configure --prefix=/opt/nginx --with-http_stub_status_module --with-pcre=../pcre-6.6 --with-http_realip_module
make
make install

在server中增加:

1
2
3
set_real_ip_from 192.168.1.0/24;
set_real_ip_from 192.168.2.1;
real_ip_header [X-Real-IP|X-Forwarded-For];

需要说明的地方就是设置IP源的时候可以设置单个IP,也可以设置IP段,另外是使用X-Real-IP还是X-Forwarded-For,取决于前面的服务器有哪个头。

set_real_ip_from 设置的IP端可以让运维查看日志,看下你的请求是来自哪些ip段。

重新加载一下服务,差不多就OK了。

再查看日志的话,应该可以看到客户端的真实IP了。

注意:如果未安装该模块的话你的获取到的IP端可能是来自前端代理(如squid)的IP,结果就是多个用户被当成单个用户对待,导致应用不能响应。 参考:http://hi.baidu.com/thinkinginlamp/item/e2cf05263eb4d18e6e2cc3e6

再PS一下: 自测: 有条件的自己可以用ab或者webben自测一下。

未安装前压测的话,因为有大量请求,所以access.log会有大量日志,而error.log日志没有变化。

1
2
3
4
5
6
7
[root@qrwefsdf talk]# webbench -c 30 -t 30 http://xxx.com
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http://xxx.com
30 clients, running 30 sec.
Speed=193468 pages/min, 1254317 bytes/sec.
Requests: 96734 susceed, 0 failed.

安装后会发现很多超出的请求会返回503,所以access.log日志变化不快,error.log有大量记录,提示limit_reque缓住了多少请求。

1
2
3
4
5
6
7
[root@qrwefsdf talk]# webbench -c 30 -t 30 http://xxxx.com
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.
Benchmarking: GET http://xxx.com
30 clients, running 30 sec.
Speed=120 pages/min, 778 bytes/sec.
Requests: 60 susceed, 0 failed.

Nginx限流配置的更多相关文章

  1. 死磕nginx系列--nginx 限流配置

    限流算法 令牌桶算法 算法思想是: 令牌以固定速率产生,并缓存到令牌桶中: 令牌桶放满时,多余的令牌被丢弃: 请求要消耗等比例的令牌才能被处理: 令牌不够时,请求被缓存. 漏桶算法 算法思想是: 水( ...

  2. 图解Nginx限流配置

    本文以示例的形式,由浅入深讲解Nginx限流相关配置,是对简略的官方文档的积极补充. Nginx限流使用的是leaky bucket算法,如对算法感兴趣,可移步维基百科先行阅读.不过不了解此算法,不影 ...

  3. [转]Nginx限流配置

    原文:https://www.cnblogs.com/biglittleant/p/8979915.html 作者:biglittleant 1. 限流算法 1.1 令牌桶算法 算法思想是: 令牌以固 ...

  4. nginx之 nginx限流配置

    limit_req zone=req_zone;严格依照在limti_req_zone中配置的rate来处理请求超过rate处理能力范围的,直接drop表现为对收到的请求无延时limit_req zo ...

  5. nginx 限流配置

    上配置 http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr ...

  6. Nginx限流办法

    Nginx 限流 电商平台营销时候,经常会碰到的大流量问题,除了做流量分流处理,可能还要做用户黑白名单.信誉分析,进而根据用户ip信誉权重做相应的流量拦截.限制流量.Nginx自身有的请求限制模块ng ...

  7. Nginx限流

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 在当今流量徒增的互联网时代,很多业务场景都会涉及到高并发.这个时候接口进行限流是非常有必要的,而限流是Ngin ...

  8. nginx限流&健康检查

    Nginx原生限流模块: ngx_http_limit_conn_module模块 根据前端请求域名或ip生成一个key,对于每个key对应的网络连接数进行限制. 配置如下: http模块   ser ...

  9. nginx限流模块(防范DDOS攻击)

    Nginx限流模式(防范DDOS攻击) nginx中俩个限流模块: 1.ngx_http_limit_req_module(按请求速率限流) 2.ngx_http_limit_conn_module( ...

随机推荐

  1. 使用 eclipse 的常用操作

    1.创建项目 https://blog.csdn.net/tsundere_ning/article/details/79587060 2. 常用代码块创建编辑 使得eclipse 相应, 点击右上角 ...

  2. 怎么编辑PDF文件内容,PDF文件编辑方法

    怎样编辑PDF文件内容?这是一个常常困扰我们的问题,工作当中我们经常会收到PDF格式的文件,但有时的文件内容不是我们想要的或者是觉得不合理的需要改掉.但是每次有这样的问题时都没有什么好的解决方法,每次 ...

  3. SSM框架中写sql在dao文件中以注解的方式

    1以注解方式 //两个参数其中一个是对象需写,对象.属性 @Update("update delivery_address set consignee = #{address.consign ...

  4. iOS开发之常用路径及文件操作方法

    一.常用的路径方法 1.获取AppName.app 目录路径: NSString *path = [[NSBundle mainBundle] bundlePath]; 2.获取Documents目录 ...

  5. 记一个 dubbo中hessian2反序列化 Map 的一个问题

    dubbo版本: 2.5.10 解决方案: 改用 "dubbo" 序列化方式 (但是 dubbo 方式也存在一个比较坑的问题 详见: Dubbo序列化多个CopyOnWriteAr ...

  6. sql 语句中count()有条件的时候为什么要加上or null

    参考:https://blog.csdn.net/qq_32719287/article/details/79513164 1.sql 语句中count()有条件的时候为什么要加上or null. 如 ...

  7. MySql恢复密码的过程

    密码是一个非常重要的东西,所以往往设置的很复杂,也往往一不小心.......就忘了  : ( 很多童鞋在Linux下看到一堆命令行往往都是一脸懵逼,不知从何下手,这里记录了下基本的恢复操作以备不时之需 ...

  8. Linux命令学习总结之rmdir命令的相关资料可以参考下

    这篇文章主要介绍了Linux命令学习总结之rmdir命令的相关资料,需要的朋友可以参考下(http://www.nanke0834.com) 命令简介: rmdir命令用用来删除空目录,如果目录非空, ...

  9. Linux-网络综合实验

    题目要求:财务部门有俩台机器acc-1和acc-2,it部门有俩台机器it-2和it-2,要求acc机器互通,it机器互通,财务部和it部机器通过路由器互通

  10. DBUtils - Python数据库连接池

    flask没有ORM操作这一功能, 但是想要操作数据库怎么办呢, 使用第三方包DBUtils 查询需要SQL原生语句! DBUtils 第一步还是要下载 使用pycharm直接搜索DBUtils fr ...