1 限流
主要是当访问量达到一个限制量的时候可以选择以服务器为主要,而选择对用户访问请求的量做限制,对于超出限制的用户请求会采取丢弃或者延迟处理等 方式处理,来保证更多用户来访问处理。
比如:某一服务器正常在高峰期上能支持的访问量是1w,但是突然某一时刻在访问量上突然暴增一下子超过3w,5w则可能会导致服务器宕机,这个时候我们 就可以通过设置最大的访问如1分钟访问8000次。
也可以防止攻击(对同一个ip每秒访问多少次)如:30min/次。
对应模块
ngx_http_limit_conn_module 限制连接数
ngx_http_limit_reg_module 限制请求频率
1.1 ngx_http_limit_reg_module限制请求频率
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
...
server {
...
location /search/ {
limit_req zone=one burst=5;
}
}
语法: limit_req zone=name [burst=number] [nodelay];
语法: limit_req_zone $variable zone=name:size rate=rate;
$variable:变量
zone:代表当前限制的名称与存放大小
name:名称
size:存放客户端信息的大小
rate:表示速率
例子1: limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
zone=one 表示设置了名为“one”,大小为10兆字节,也可以理解为设置的限流名为one rate=10r/s 的意思是允许1秒钟不超过10个请求。
使用$binary_remote_addr【这是一个二进制的信息记录 $remote_addr(非二进制的)】(nginx本身存在的,保存客户端的ip地址)变量,可以将每条状态记录的 大小减少到64个字节,这样1M的内存可以保存大约1万6千个64字节的记录。如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 503 (Service Temporarily Unavailable)错误。
速度可以设置为每秒处理请求数和每分钟处理请求数,其值必须是整数,所以如果你需要指定每秒处理少于1个的请求,2秒处理一个请求,可以使用 “30r/m”。
1.2 ngx_http_limit_conn_module限制请求连接数
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
...
server {
...
location /download/ {
limit_conn addr 1;
}
}
语法:limit_conn_zone $binary_remote_addr zone=addr:10m;
说明:区域名称为addr,大小为10m,键值是客户端IP。 如果限制域的存储空间耗尽了,对于后续所有请求,服务器都会返回 503 (Service Temporarily Unavailable)错误。
下载限速操作实例:
http {
# ....
limit_conn_zone $binary_remote_addr zone=addr:10m;
# ....
server {
location / {
# root html;
autoindex on;
# 是限制每个IP只能发起1个连接 (addr 要跟 limit_conn_zone 的变量对应)
limit_conn addr 1;
limit_rate 10k; #限速为 10KB/秒
root /redis_2004;
# index index.html index.htm;
}
}
}