在现代 Web 开发中,服务器安全至关重要。如果你的网站突然遭遇大量请求(比如爬虫、恶意脚本或 DDoS 攻击),服务器可能会不堪重负甚至崩溃。这时候,Nginx 请求频率限制就派上大用场了!
本文将带你从零开始,一步步配置 Nginx 的限流功能,即使你是完全的小白,也能轻松上手。
什么是 Nginx 请求频率限制?
Nginx 请求频率限制(也叫 Rate Limiting)是一种通过 Nginx 内置模块 ngx_http_limit_req_module 来控制客户端在单位时间内可发送请求数量的功能。它可以有效防止暴力破解、爬虫滥用和 防止DDoS攻击 等问题。
核心概念:漏桶算法
Nginx 使用“漏桶算法”(Leaky Bucket)来实现限流:
- 请求像水一样流入“桶”中;
- 桶以固定速率“漏水”(即处理请求);
- 如果桶满了(超过设定阈值),新请求就会被拒绝或延迟。
第一步:检查 Nginx 是否支持限流模块
大多数现代 Nginx 版本默认都包含 ngx_http_limit_req_module 模块。你可以通过以下命令确认:
nginx -V 2>&1 | grep -o with-http_limit_req_module 如果有输出 with-http_limit_req_module,说明你的 Nginx 支持限流功能。
第二步:配置限流规则
我们将在 Nginx 配置文件中添加限流规则。通常配置文件位于 /etc/nginx/nginx.conf 或站点配置文件如 /etc/nginx/sites-available/default。
首先,在 http 块中定义一个限流区域(zone):
http { # 定义一个名为 'mylimit' 的限流区域 # 使用客户端 IP 作为 key,10MB 内存可存储约 16 万个 IP 地址 limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s; server { listen 80; server_name example.com; location /login/ { # 应用限流规则:每秒最多 1 个请求,突发允许 5 个 limit_req zone=mylimit burst=5 nodelay; proxy_pass http://backend; } }} 参数说明:
$binary_remote_addr:使用客户端 IP 地址作为限流的唯一标识;zone=mylimit:10m:创建一个名为mylimit的共享内存区,大小为 10MB;rate=1r/s:限制速率为每秒 1 个请求(也可写成60r/m表示每分钟 60 个);burst=5:允许突发请求最多 5 个(放入“队列”等待处理);nodelay:不延迟处理突发请求,立即响应(否则会匀速处理)。
第三步:自定义错误响应
当请求被限流时,默认返回 503 错误。你可以自定义更友好的提示:
error_page 503 = @too_many_requests;location @too_many_requests { return 429 "请求过于频繁,请稍后再试!\n";} 这样,当用户触发限流时,会收到 HTTP 429(Too Many Requests)状态码和友好提示。
第四步:测试限流效果
使用 curl 或压力测试工具(如 ab 或 hey)进行测试:
# 快速连续请求 10 次for i in {1..10}; do curl -I http://example.com/login/; done 你会看到部分请求返回 HTTP/1.1 200 OK,而超出限制的请求返回 HTTP/1.1 429 Too Many Requests。
高级技巧:按用户或路径限流
你还可以根据不同的条件限流,例如:
- 按用户 ID 限流:
limit_req_zone $arg_user_id zone=userlimit:10m rate=5r/s; - 对 API 路径单独限流:
location /api/ { limit_req zone=apilimit; }
总结
通过合理配置 nginx rate limiting,你可以有效保护后端服务免受异常流量冲击。无论是防止恶意爬虫、暴力登录尝试,还是缓解小型 防止DDoS攻击,Nginx 限流都是简单而强大的第一道防线。
记住:限流不是万能的,但它绝对是每个运维人员工具箱中的必备技能。赶快动手试试吧!
关键词回顾:Nginx限流、请求频率限制、nginx rate limiting、防止DDoS攻击。
