Nginx DOS 攻击防护教程
如果你的 Web 服务器直接暴露于互联网,那么最好启用某种拒绝服务保护。
Nginx 本身无法防御更复杂的分布式 DOS 攻击(这需要 CDN),但这并不妨碍采取一些基本DOS保护措施,这也很容易设置。
连接限制
这是一种敏感的预防措施,可以避免来自单个 IP 的过多连接,并且它是抵御微不足道的 DOS 攻击的第一道防线(即一个简单的脚本从具有 1 个 IP 的 1 个服务器淹没我们的后端)
limit_conn_zone $binary_remote_address zone=addr:10m;
limit_conn servers 1000;
这个简单的代码片段强制规定每个 IP 在任何时候最多可以有 1000 个连接。
10 MB (10m) 将为我们提供足够的空间来存储 160k 请求的历史记录
1000,如果有必要,可以调整和降低限制,始终考虑到我们的客户端可能位于代理后面,并且许多连接可能会从很少的 IP 访问我们的服务器
速率限制
速率限制的工作原理与连接限制非常相似,但从单个 IP 地址每秒接受多少个请求的角度来看
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
limit_req zone=one burst=10;
limit_req_status 503; # default value anyway
在这个例子中:
允许来自 1 个 IP 地址的每秒 5 个请求。\
在 5 到 10 个请求/秒之间,所有新传入请求都会延迟。\
每秒超过 10 个请求,所有新传入请求均被拒绝,状态代码设置为limit_req_status\
或者我们可以添加nodelay选项
limit_req zone=one burst=10 nodelay;\
以便在 5 到 10 个请求/秒之间,所有新传入请求都会尽可能快地得到服务,从而形成burst(10 个请求/秒)硬限制和软限制,在此之后请求将被拒绝
带宽限制
带宽限制在 Amazon EC2 等带宽受限的环境中特别有用,在这种环境中,带宽耗尽会导致所有流量几乎停止(即您的后端离线)
limit_rate 50k;
limit_rate_after 500k;
使用 Nginx,我们只能在第一个 500kb 服务完成后将带宽限制为 50kb/秒,以便 Web 服务器有选择地减慢对大负载的请求,同时允许全速处理其他请求
缓存
最后但并非最不重要的一点是,缓存是通过利用 Nginx 提供的超级优化缓存层来为应用程序增加弹性的最有效方法,该层可以轻松地为小负载提供每秒数千个请求的服务
如果您还没有设置缓存,那么您应该这样做。