服务器被恶意爬虫或高频请求搞到卡顿甚至宕机,这事儿不少运维都遇到过。其实解决方案很简单——Nginx自带一个叫ngx_http_limit_req_module的模块,专门用来限制客户端请求速率,相当于给服务器加了个“流量阀门”。下面直接上实战配置。
先确认Nginx装好了:
如果还没装,用这两条命令搞定:sudo apt update sudo apt install nginx找到配置文件下手:
主配置文件一般在/etc/nginx/nginx.conf,不过更常见的做法是编辑虚拟主机配置,比如/etc/nginx/sites-a vailable/default:sudo nano /etc/nginx/sites-a vailable/default写入限频配置:
在server块或location块里加上下面这段,注意要放在http块内(如果写在单独文件,记得包含进来):http { # 其他配置... limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s; server { listen 80; server_name example.com; location / { limit_req zone=mylimit burst=5 nodelay; # 其他location配置... } } }这里解释一下每行在干什么:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;—— 用客户端IP($binary_remote_addr)作为标识,定义了一个叫mylimit的共享内存区域,大小10MB,速率限制为每秒1个请求。limit_req zone=mylimit burst=5 nodelay;—— 引用上面定义的区域,允许瞬时突发5个请求(burst=5),并且这些突发请求不延迟处理(nodelay),直接放行,但超过这个额度就会返回503。
测试配置并生效:
sudo nginx -t sudo systemctl reload nginx如果测试通过,配置就生效了。现在你可以根据实际压力调整
rate和burst:比如想让每分钟最多60个请求,就把rate改成60r/m。
进一步优化
- 基于API密钥的限制:如果需求更复杂,比如要根据不同API Key做差异化限流,可以用
ngx_http_auth_request_module结合外部认证服务来实现。 - 日志记录:建议开启限制日志,方便监控哪些请求被拦截,排查问题。具体配置可以加
limit_req_log_level指令。
这套配置上手快、性能开销小,是保护Nginx服务器最基础也最有效的手段之一。根据业务场景灵活调整参数,就能在防攻击和用户体验之间找到平衡点。