使用NGINX和NGINX Plus来抵御DDoS攻击
NGINX和NGINX Plus具有许多功能,与上述的DDoS攻击特性相结合,可以使它们成为DDoS攻击缓解解决方案的重要组成部分。这些功能通过调节传入流量并通过控制流量代理后端服务器来解决DDoS攻击。
NGINX事件驱动架构的内在保护
NGINX旨在成为您的网站或应用程序的“减震器”。它具有非阻塞的事件驱动架构,可以应对大量请求,而不会明显增加资源利用率。
来自网络的新请求不会中断NGINX处理正在进行的请求,这意味着NGINX可以利用下面描述的技术来保护您的站点或应用免受攻击。
有关底层架构的更多信息,请参阅Inside NGINX:我们如何为性能和规模设计。
限制请求率
您可以将NGINX和NGINX Plus接收传入请求的速率限制为实际用户的典型值。例如,您可能会决定访问登录页面的真实用户每2秒只能发出一个请求。您可以配置NGINX和NGINX Plus,以允许单个客户端IP地址每2秒尝试登录(相当于每分钟30个请求):
limit_req_zone $binary_remote_addr zone=one:
10m
rate=
30r
/m;
server {
# ...
location /login.html {
limit_req zone=one;
# ...
}
}
该 limit_req_zone 指令配置一个名为“ one”的共享内存区域,用于存储指定密钥的请求状态,在本例中为客户机IP地址( $binary_remote_addr)。/login.html块中的 limit_req 指令引用共享内存区域。 location
有关速率限制的详细讨论,请参阅博客上的NGINX和NGINX Plus的速率限制。
限制连接数量
您可以限制单个客户端IP地址可以打开的连接数,也可以限制为适合真实用户的值。例如,您可以允许每个客户端IP地址打开不超过10个到您网站的/ store区域的连接:
limit_conn_zone $binary_remote_addr zone=addr: 10m ;
server {
# ...
location /store/ {
limit_conn addr 10 ;
# ...
}
}
该 limit_conn_zone 指令配置了一个名为addr的共享内存区域,用于存储指定密钥的请求,在这种情况下(如前例所示)客户端IP地址 $binary_remote_addr。在 limit_conn该指令 location为块/存储引用共享存储器区,并设置一个最大从每个客户端IP地址10个连接。
关闭慢速连接
您可以关闭正在写入数据的连接,这可能意味着尝试尽可能保持连接打开(从而降低服务器接受新连接的能力)。Slowloris就是这种攻击的一个例子。该 client_body_timeout指令控制NGINX在客户机体写入之间等待的时间,该 client_header_timeout 指令控制NGINX在写入客户机标题之间等待的时间。这两个指令的默认值是60秒。本示例将NGINX配置为在来自客户端的写入或头文件之间等待不超过5秒钟:
server {
client_body_timeout 5s;
client_header_timeout 5s;
# ...
}








