在 Nginx 中可以通过不同的方式进行请求限流,常见的有基于 IP 地址的限流、基于请求速率的限流以及基于连接数的限流等,以下为你详细介绍各种限流设置的实现方法。
基于 IP 地址的限流
这种方式可以限制每个 IP 地址在一定时间内的请求次数。
配置步骤
- 定义限流区域:在
http
块中定义一个限流区域,使用limit_req_zone
指令。
http {
# 定义一个名为 one 的限流区域,使用 $binary_remote_addr 作为键(即客户端 IP 地址)
# zone=one:10m 表示分配 10MB 的内存来存储限流信息
# rate=1r/s 表示允许每个 IP 地址每秒最多发起 1 个请求
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;server {
listen 80;
server_name example.com;location / {
# 应用名为 one 的限流规则
limit_req zone=one;
proxy_pass http://backend;
}
}
}
配置解释
$binary_remote_addr
:表示客户端的 IP 地址,使用二进制形式存储,节省内存。zone=one:10m
:定义一个名为one
的限流区域,分配 10MB 的内存来存储限流信息。rate=1r/s
:表示允许每个 IP 地址每秒最多发起 1 个请求。limit_req zone=one
:在location
块中应用名为one
的限流规则。
可选参数
burst
:允许突发的请求数量。例如limit_req zone=one burst=5
,表示允许在瞬间有 5 个突发请求,但后续请求会按照设定的速率进行限制。nodelay
:当突发请求超过burst
数量时,不进行延迟处理,直接返回 503 错误。例如limit_req zone=one burst=5 nodelay
。
基于请求速率的限流
除了基于 IP 地址限流,还可以对整个服务器的请求速率进行限制。
配置步骤
http {
limit_req_zone $server_name zone=all:10m rate=10r/s;server {
listen 80;
server_name example.com;location / {
limit_req zone=all;
proxy_pass http://backend;
}
}
}
配置解释
$server_name
:表示服务器名称,这里以服务器名称为键进行限流。zone=all:10m
:定义一个名为all
的限流区域,分配 10MB 的内存。rate=10r/s
:表示整个服务器每秒最多允许 10 个请求。
基于连接数的限流
可以限制每个客户端 IP 地址的最大连接数。
配置步骤
http {
# 定义一个名为 conn_limit 的限流区域,使用 $binary_remote_addr 作为键
# zone=conn_limit:10m 表示分配 10MB 的内存来存储连接信息
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;server {
listen 80;
server_name example.com;location / {
# 限制每个 IP 地址最多同时建立 5 个连接
limit_conn conn_limit 5;
proxy_pass http://backend;
}
}
}
配置解释
limit_conn_zone $binary_remote_addr zone=conn_limit:10m
:定义一个名为conn_limit
的连接限制区域,使用客户端 IP 地址作为键,分配 10MB 的内存来存储连接信息。limit_conn conn_limit 5
:在location
块中应用连接限制规则,限制每个 IP 地址最多同时建立 5 个连接。
验证配置并重启 Nginx
在修改完 Nginx 配置文件后,需要验证配置的正确性并重启 Nginx 服务。
# 验证配置文件
sudo nginx -t# 重启 Nginx 服务
sudo systemctl restart nginx
Nginx 请求限流可以通过多种模块来实现,常见的有ngx_http_limit_req_module
模块和ngx_http_limit_conn_module
模块,以下是它们的对比:
功能特点
ngx_http_limit_req_module
:主要用于限制请求的速率,通过漏桶算法来控制请求的处理速度,允许一定数量的请求在桶中排队等待处理,超过限制的请求则会被拒绝。可以根据客户端的 IP 地址、特定的请求头或其他变量来限制请求速率。ngx_http_limit_conn_module
:用于限制连接数,即同时连接到服务器的客户端数量。它可以根据客户端的 IP 地址或其他变量来限制每个 IP 地址或整个服务器的连接数。
应用场景
ngx_http_limit_req_module
:适用于对请求频率有严格限制的场景,例如防止恶意攻击、限制 API 接口的调用频率等。可以有效防止短时间内大量请求对服务器造成压力,保护服务器资源不被耗尽。ngx_http_limit_conn_module
:主要用于限制并发连接数,适用于服务器资源有限,需要控制同时连接到服务器的客户端数量的场景。例如,当服务器的带宽、内存或 CPU 资源有限时,限制连接数可以避免服务器因过载而崩溃。
配置方式
ngx_http_limit_req_module
:配置相对复杂一些,需要定义限流的规则和桶的容量等参数。例如,可以使用limit_req_zone
指令来定义一个限流区域,然后在服务器或位置块中使用limit_req
指令来应用限流规则。ngx_http_limit_conn_module
:配置相对简单,只需要使用limit_conn_zone
指令定义连接数限制的区域,然后在服务器或位置块中使用limit_conn
指令来应用限制即可。
对性能的影响
ngx_http_limit_req_module
:由于需要对每个请求进行速率检查和排队处理,可能会对性能产生一定的影响,尤其是在高并发场景下。但是,通过合理配置桶的容量和请求速率,可以在保证服务器性能的前提下,有效限制请求频率。ngx_http_limit_conn_module
:对性能的影响相对较小,主要是在连接建立时进行连接数的检查,一旦连接建立后,对请求的处理性能影响不大。
总的来说,ngx_http_limit_req_module
和ngx_http_limit_conn_module
都有各自的优势和适用场景,在实际应用中,需要根据具体的业务需求、服务器资源状况和性能要求来选择合适的限流模块,并进行合理的配置。