在Debian系统上配置Nginx以限制请求频率是保障服务稳定性和安全性的重要手段。Nginx提供了多种模块来实现请求频率限制,包括ngx_http_limit_req_module
和ngx_http_limit_conn_module
。以下是关于如何在Nginx中配置请求频率限制的详细步骤和示例。
通过ngx_http_limit_req_module
模块实现请求频率限流,通常使用令牌桶算法。以下是一个基本的配置示例:
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://backend;
limit_req_status 429;
}
}
}
参数解析:
zone=api_limit:10m
:定义一个名为api_limit
的内存区域,大小为10MB,用于存储访问状态。rate=10r/s
:每秒允许10个请求,实际按毫秒平滑处理。burst=20
:允许突发20个请求排队。nodelay
:不延迟处理突发请求。通过ngx_http_limit_conn_module
模块实现并发连接数限制:
http {
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location /download/ {
limit_conn conn_limit 5; # 单IP最大5并发连接
limit_rate_after 10m; # 下载10MB后限速
limit_rate 100k; # 限速到100KB/s
}
}
}
参数解析:
limit_conn conn_limit 5
:限制单个IP的最大并发连接数为5。limit_rate_after 10m
:当下载量达到10MB后开始限速。limit_rate 100k
:限速到100KB/s。使用geo
模块定义白名单IP列表,白名单中的IP将不受访问频率限制:
http {
geo $limit {
default 1;
192.168.1.0/24 0; # 白名单IP段
10.0.0.1 0; # 单个白名单IP
}
map $limit $limit_key {
0 ""; # 白名单IP,值为空
1 $binary_remote_addr; # 非白名单IP,值为客户端IP
}
limit_req_zone $limit_key zone=one:10m rate=1r/s;
server {
listen 80;
server_name example.com;
location / {
limit_req zone=one burst=5 nodelay;
proxy_pass http://backend;
}
}
}
配置说明:
geo $limit
:定义白名单IP列表,默认值为1(限制),白名单IP段和单个白名单IP的值设为0。map $limit $limit_key
:创建映射,将$limit变量的值映射为$limit_key。limit_req_zone
:定义限流区域,zone=one:10m
表示区域名为one,分配10MB内存,rate=1r/s
表示每秒允许1个请求。location /
:在location中应用限流规则,burst=5
表示允许突发5个请求,nodelay
表示立即处理突发请求而不延迟。以上配置示例展示了如何在Nginx中实现请求频率限制,包括针对特定IP的访问控制、白名单IP的免限制以及并发连接数的限制。通过合理配置这些参数,可以有效防止服务被恶意攻击,同时确保正常用户的访问体验。