Nginx 是一款流行的反向代理和负载均衡服务器,也可以用于实现服务熔断和限流。通过使用 Nginx 的限流和熔断模块,比如:ngx_http_limit_req_module 和 ngx_http_limit_conn_module,可以在代理层面对服务进行限流和熔断。

针对高并发的场景。Nginx的限流主要是两种方式:
Nginx中使用 ngx_http_limit_req_module模块来限制请求的访问频率,基于漏桶算法原理实现。
使用 nginx的 limit_req_zone 和 limit_req 两个指令。
limit_req_zone:限制单个IP的请求处理速率。
基本语法:limit_req_zone key zone rate
http {
# 请求限流定义1:
# - $binary_remote_addr:限制对象(客户端)
# - zone:定义限制(策略)名称
# - 10m:用十兆空间记录访问次数
# - rate:每秒10次的请求处理速率
limit_req_zone $binary_remote_addr zone={limits-name}:10m rate=10r/s;
# 请求限流定义2:
# - $server_name:限制对象,对指定服务器请求的限制
limit_req_zone $server_name zone={limits-name}:10m rate=10r/s;
server {
location /search/ {
# 引用以上定义的限流策略,做以下设定(漏桶方式)
# - burst:最多接收6个排队用户IP(从0开始计数),处于等待处理状态(容量)
# - nodelay:超出排队之外的更多请求,拒绝并返回503(溢出)
limit_req zone={limits-name} [burst=5] [nodelay];
}
}
}
针对流量突然增大,超出的请求无法处理时,可以通过 Nginx提供的 burst 参数来解决突发流量的问题,并结合 nodelay 参数一起使用。
第一步:修改Nginx的配置文件
http {
# 请求限流定义:
limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=1r/s;
server {
listen 80;
server_name 192.168.xxx.xxx; # 指定虚拟主机的IP,或者外网域名
location / {
root html;
index index.html index.htm;
proxy_pass http://192.168.xxx.xxx:8080;
limit_req zone=myRateLimit burst=5 nodelay;
}
}
}
第二步:重启Nginx
修改 nginx完之后,保存退出,重启Nginx。
# 先执行停止命令再执行启动命令
[root@centos7 sbin]# /usr/local/nginx/sbin/nginx -s quit
[root@centos7 sbin]# /usr/local/nginx/sbin/nginx
第三步: 浏览器快速访问

Nginx 的 ngx_http_limit_conn_module模块提供了对资源连接数进行限制的功能。
使用 limit_conn_zone 和 limit_conn 两个指令。
http_limit_conn:单个IP同时允许的连接限制。
http {
# 连接限流定义1:
# - $binary_remote_addr:限制对象(客户端)
# - zone:限制自定义名称
# - 10:内存中用10兆空间存储连接记录
limit_conn_zone $binary_remote_addr zone={limits-name}:10m;
# 请求限流定义2:
# - $server_name:限制对象,对指定服务器请求的限制
limit_conn_zone $server_name zone={limits-name}:10m;
server {
location /search/ {
# 限制单个IP同时允许建立多少连接(并发限制)
limit_conn {limits-name} 1;
}
}
}
第一步:修改Nginx的配置文件
http {
# 请求限流定义:
limit_conn_zone $binary_remote_addr zone=myConnLimit:10m;
server {
listen 80;
server_name 192.168.xxx.xxx; # 指定虚拟主机的IP,或者外网域名
location / {
root html;
index index.html index.htm;
proxy_pass http://192.168.xxx.xxx:8080;
# 限制单个IP同时允许建立5个连接
limit_conn zone=myConnLimit 5;
}
}
}
第二步:重启Nginx
修改 nginx完之后,保存退出,重启Nginx。
# 先执行停止命令再执行启动命令
[root@centos7 sbin]# /usr/local/nginx/sbin/nginx -s quit
[root@centos7 sbin]# /usr/local/nginx/sbin/nginx
第三步: 浏览器快速访问

– 求知若饥,虚心若愚。