1 Nginx访问限制
经常会遇到这种情况,服务器流量异常,负载过大等等,对于流量恶意的攻击访问,会带来带宽的浪费,服务器压力,影响业务,往往考虑到对同一个ip的连接数,并发数进行限制。
ngx_http_limit_conn_module模块可以根据一定的key来限制每个键值的连接数,如同一个IP来源的连接数
limit_conn_module 连接频率限制
limit_req_module 请求频率限制
http协议的连接与请求
HTTP是建立在TCP上,完成HTTP请求需要先建立TCP三次握手(称为TCP连接),再连接的基础上HTTP请求
HTTP请求建立在一次TCP连接基础上,一次TCP请求至少产生一次HTTP请求。
变量:
$binary_remote_addr 变量的长度是固定的4字节
$remote_addr 变量的长度是7-15字节
IP个ip地址32bit=4字节
1.1 Nginx连接限制语法
Syntax:limit_conn_zone key zone=name:size;
Default:–
Context:http
Syntax:limit_conn zone number;
Default:-
Context:http, server, location
1.2 代码使用方法
Nginx 连接限制实践
http {
//http段配置连接显示,同一时刻只允许一个客户端IP连接
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
......
server {
......
location / {
.....
limit_conn conn_zone 1; //同一时刻只允许一个客户端ip连接
}
}
Nginx请求限制实战
http {
//http段配置请求限制,rate限制速率,限制一秒钟最多一个ip请求
limit_req_zone $binary_remote_addr zone=req_game:10m rate=1r/s;
.....
server {
......
location / {
//1r/s只接受一个请求,,其余请求决绝并返回错误代码给客户端
#limit_req zone=req_game;
//请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量,多余的请求返回503
limit_req zone=req_game burst=3 nodelay;
}
}
}
1.3 压力测试
使用ab工具进行压力测试
yum install -y httpd-tools
[root@nginx_web1 ~]# ab -n 50 -c 20 http://127.0.0.1/index.html
4.4 Nginx连接限制没有请求限制有效
我们前面说的,多个请求可以建立再一次tcp连接之上,那么我们对请求的精准度,当然比对一个链接限制会更加有效,因为同一时刻只允许一个连接请求进入,但是同一时刻多个请求可以通过一个连接进入。所以我们请求限制是比较优的解决方案。