一.背景
我们经常遇到这种情况,客户使用生产环境进行了压力测试,大量的请求,导致其他客户的请求未能响应。
服务器资源有限,但是客户端来的请求在不断的上涨, 为了保证一部分的请求能够正常相应, 不得不放弃一些客户端来的请求, 这个时候我们会选择行的进行一些NGINX的限流操作, 这种操作可以很大程度上缓解服务器的压力, 使其他正常的请求能够得到正常响应.
二.使用nginx模块
- 1. ngx_http_limit_conn_module模块
说明:此模块用来限制单IP的连接数
配置方式:
1.在nginx配置文件中的http配置模块添加: limit_conn_zone key zone=name:size;
说明:开辟一个内存空间,为不同的key值保存状态,状态属性里面有当前来的连接数。key可以为变量,这里的key为$binary_remote_addr,即远程服务器的地址。name为该空间的命名,size为大小。
PS: 64位系统上,$binary_remote_addr存储占用64 bytes内存空间,状态存储占用64bytes内存空间,1M的size能存8192个不同$binary_remote_addr的状态。
2. 再在http->server->location配置模块中添加:limit_conn zone number;
说明:在当前location下,命名为zone的key值对应的连接数不能超过number,如果超过了,就会返回503错误
配置实例:
http {
# 定义一个key为$binary_remote_addr、名字为addr、空间大小为10M的limit_conn_zone
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
server {
...
location /download/ {
# 定义当前location下$binary_remote_addr对应的连接数不能超过1
limit_conn addr 1;
}
}
}
- ngx_http_limit_req_module模块
说明:此模块用来限制单IP的请求频率
配置方式:
1.在nginx配置文件中的http配置模块添加: limit_req_zone key zone=name:size rate[rate];
说明:开辟一个内存空间,为不同的key值保存状态,状态属性里面有当前来的次数数。key可以为变量,这里的key为$binary_remote_addr,即远程服务器的地址。name为该空间的命名,size为大小,rate为限制的频率。
PS: 64位系统上,$binary_remote_addr存储占用64 bytes内存空间,状态存储占用64bytes内存空间,1M的size能存8192个不同$binary_remote_addr的状态。
2. 再在http->server->location配置模块中添加:limit_req_zone=name [brust=number] [nodelay];
说明:当前location受zone名为name的limit_req_zone限制,burst为可配参数,该配置可以理解为允许速率超过正常的请求个数(实际上比这个复杂的多),数量为number个,如果超过了,可配参数nodelay配置了就会返回503错误,没有配置超过的请求就会排队等待。
配置示例:
http {
# 定义一个key为$binary_remote_addr、名字为one、空间大小为10M、速度限制为1次每秒的limit_req_zone
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location /search/ {
# 定义当前location请求受名为one的limit_req_zone限制,令牌数为5,请求溢出后直接报错
limit_req zone=one burst=5 nodelay;
}
}
}
附录:
可能存在有些IP我们是不想被限制的,则可利用nginx_http_geo_module 和 ngx_http_map_module模块
具体参考:http://nginx.org/en/docs/http/ngx_http_geo_module.html
http://nginx.org/en/docs/http/ngx_http_map_module.html
具体配置示例:
http {
# 定义名为$whiteiplist的geo,会根据client IP 映射成不同的值,默认值为1,白名单ip的值为0
geo $whiteiplist {
default 1; #IP默认映射为1,根据geo的优先级,优先匹配完整IP。
192.168.1.10 0; #将192,168.10.0映射为0
192.168.1.11 0;
}
# 定义名为$limit变量,$limit变量的值是由$whiteiplist的值决定的,当$whiteiplist为1时,$limit的值为$binary_remote_addr;当$whiteiplist为0时,$limit的值为空
map $whiteiplist $limit {
1 $binary_remote_addr;
0 "" ;
}
# 定义一个key为$limit、名字为one、空间大小为10M、速度限制为1次每秒的limit_req_zone
limit_req_zone $limit zone=one:10m rate=1r/s;
……
server {
...
location /search/ {
# 定义当前location请求受名为one的limit_req_zone限制,令牌数为5,请求溢出后直接报错
limit_req zone=one burst=5 nodelay;
}
}
}
PS:特别要感谢我们公司的无忌大哥,出自他手,我只是一个过客。
原文地址:https://blog.csdn.net/qq_29069885/article/details/73301850
相关推荐
对于nginx做ip限制一些总结。
nginx 限制ip、并发量、连接数等配置
nginx限流
nginx 实现对ip的限流。
python脚本 从nginx的访问log,获取访问IP,记录到redis,根据IP访问数量判断是否存在安全问题,记录不正常IP,(写入到防火墙过滤-待完成)
主要介绍了Nginx对网段内ip的连接数限流配置详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
分布式限流面试专题系列:Nginx+zookeeper.zip
web服务器如何限流-nginx,tomcat服务器如何限制流量 用ab压测工具测试限流效果
操作系统环境 演示环境为centos7.7-x86_64-minimal 操作系统 IP 部署 说明 192.168.1.91 — 虚IP映射域名 192.168.1.97 keepalived 主要节点 192.168.1.98 keepalived 备份节点 ...
CentOS7.3下Nginx基于IP+端口的虚拟主机配置实战,有需要的可以看一下
nginx、ffmpeg转流文件源码。 多个同时转流。 nginx、ffmpeg转流文件源码 代码
nginx nginx限制ip并发数,也是说限制同一个ip同时连接服务器的数量 1.添加limit_zone 这个变量只能在http使用 vi /usr/local/nginx/conf/nginx.conf limit_zone one $binary_remote_addr 10m; 2.添加limit_conn 这...
本文主要阐述如何用nginx 来实现限流. 听说 Hystrix 也可以, 各位有兴趣可以去研究哈 . 2.首先部署一个对外暴露接口的程序 我这里部署的是一个spring boot 项目 里面暴露了如下接口, 很简单 暴露了一个 get 请求...
Nginx教程 防御ddos,用户访问控制,限流.zip
nginx防并发、限制ip、连接数等配置
rk3399移植 nginx +rtmp实现流媒体服务器,实现rk3399推送网络视频流(rtmp、https),使用时在根目录下新建/home/build 文件夹,解压后进入/home/build/build/conf,打开nginx.conf 添加rtmp配置(网上很多根据自己...
nginx+lua+redis通过匹配客户端ip进行灰度发布
nginx (rtmp,hls,rtsp)视频流分发,视频直播服务器,win32
IIS7.5下同IP多域名配置SSL, IIS 7.5 以下版本不支持多域名共用443端口 SSL 服务,采用nginx 单独处理来自443端口的请求,从而实现多域名 SSL 附件包含,图文设置nginx, nginx免安装包,可直接使用,已支持SNI(Server ...