外观
限流
限流(Rate Limiting)是指对某一资源的访问频率进行限制的技术,常用于防止滥用、保证系统的稳定性、提升用户体验以及防止DDoS(分布式拒绝服务)攻击。通过限流,可以控制客户端对服务的请求次数,避免过高的并发请求压垮服务器或导致服务性能下降。
Nginx 为我们提供了两种限流的方式,一种是请求限流,另一种是连接限流。
请求限流
请求限流主要是通过限制客户端请求的频率来避免服务器过载。Nginx 使用 limit_req 模块来实现请求限流,允许你控制单位时间内允许的请求次数。请求限流限制的是每个客户端在一定时间内可以发送的请求次数。如果请求超过了限流的速率,Nginx 会返回一个 503 Service Unavailable 错误或按配置延迟处理。
语法:
limit_req zone=name [burst=number] [nodelay | delay=number];默认值:-
上下文:http、server、location。
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=1r/s;$binary_remote_addr 参数表示通过 remote_addr 这个标识做限制,限制的是同一客户端 IP 地址。它的大小可以从 7 到 15 个字节不等。它占用的空间因平台位数和 IP 类型不定。
zone=ip_limit:10m 表示生成 10M 大小的名字为 ip_limit 的内存区域,用于存储访问的频次信息。
rate=1r/s 表示允许相同标识客户端的一个访问频次,即一秒访问一次。1r 的意思是一次。
limit_req zone=ip_limit burst=5 nodelay;zone 表示使用哪个区域做限制。
burst 设置爆发访问量,当有超过访问频次限制的请求就将超出的部分暂时放到这个访问区里。
nodelay 表示超过访问频次且缓冲区满了的时候直接返回 503.如果没有设置,则所有请求会依次排队。
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=1r/s;
server {
listen 80;
location / {
# 限制请求速率
limit_req zone=ip_limit burst=5 nodelay;
proxy_pass http://backend;
}
}连接限流
连接限流主要是通过限制每个客户端与服务器的连接数来控制客户端并发连接数。Nginx 使用 limit_conn 模块来实现连接数限制,可以限制每个客户端的最大连接数,避免单一客户端占用过多的连接资源。连接限流限制的是每个客户端在同一时间内可以与服务器建立的连接数。如果客户端的连接数超过了限制,Nginx 会返回一个 503 Service Unavailable 错误。
limit_conn_zone $binary_remote_addr zone=addr:10m;$binary_remote_addr 表示通过 remote_addr 这个标识来做限制,限制的是同一客户端 IP 地址。
zone=ip_limit:10m 表示生成 10M 大小的名字为 ip_limit 的内存区域,用于存储访问的频次信息。
limit_conn zone number;默认值:-
上下文:http、server、location。
如:
limit_conn addr 1;zone 表示使用什么区域来做限制,number 代表每次允许每个相同的客户端 IP 连接数。
http {
# 定义连接限制区域,基于客户端 IP 地址
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
server {
listen 80;
location / {
# 启用连接数限制
limit_conn conn_limit_per_ip 1;
# 正常处理请求
proxy_pass http://backend;
}
}
}实际效果
配置:
limit_req_zone $binary_remote_addr zone=addr:10m rate=1r/s;
server {
listen 80;
server_name localhost;
limit_req zone=addr burst=2 nodelay;
location / {
root /usr/share/nginx/html/80;
index index.html;
}
}几秒内多次刷新页面,时不时出现 503 服务不可用状态,就是配置成功了。