nginx访问频次限制模块
nginx_http_limit_conn_zone模块
用于限制并发连接数,特别是单个IP地址的连接数量。 并非所有连接都被计算在内。只有在服务器处理了请求并且已经读取了整个请求头的情况下才计算连接。官方文档
用法
Syntax:limit_conn zone number;
Default:—
Context:http, server, location
实例
http{
limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server{
limit_conn perip 50;
limit_conn perserver 50;
limit_conn addr 1;
}
}
说明
$remote_addr变量的大小可以从7到15个字节不等。存储状态在32位平台上占用32或64字节的内存,在64位平台上总是占用64字节。 $binary_remote_addr对于IPv4地址,变量的大小始终为4个字节,对于IPv6地址则为16个字节。存储状态在32位平台上始终占用32或64个字节,在64位平台上占用64个字节。1M字节的区域可以保持大约32000个32字节的状态或大约16000个64字节的状态。
如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503 (Service Temporarily Unavailable) 错误。
由于一个页面有多个子资源,如果毫无选择的都进行限制,那就会出现很多不必要的麻烦,如:一个页面有40个子资源,那么如果想让一个页面完整的显示,就需要将请求速度和连接数都调整到40,以此达到不阻塞用户正常请求。
所以制定哪些请求是需要进行限制的,如html页面;哪些是不需要限制的,如css、js、图片等,这样就需要通过配置对应的location进一步细化。
nginx_http_limit_req_zone模块
用于限制请求处理速率,特别是来自单个IP地址的请求的处理速率。官方文档
用法
Syntax:limit_req zone=name [burst=number] [nodelay];
Default:—
Context:http, server, location
设置共享内存区域和请求的最大突发大小。如果请求速率超过为某个区域配置的速率,则它们的处理会延迟,从而使请求以定义的速率处理。过多的请求被延迟,直到它们的数量超过最大突发大小,在这种情况下请求被终止并出现错误。默认情况下,最大突发大小等于零。
实例
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location /search/ {
limit_req zone=one burst=5;
}
}
平均每秒不超过1个请求,并且突发不超过5个请求。 如果请求限制期间延迟请求过多,则不需要使用参数nodelay:
limit_req zone=one burst=5 nodelay;