1、HTTP协议简介
简单介绍一下HTTP协议的连接与请求:
HTTP协议是建立在TCP协议基础之上。HTTP请求先要进行TCP的三次握手,称为TCP的连接。建立好TCP的连接才会进行HTTP请求与响应。也就是在连接的基础之上进行HTTP请求,现在可以在一次连接的基础上建立多次请求。通过发送FIN可ACK包保持连接状态,也就是长连接。HTTP请求建立在一次TCP连接基础上,一次TCP请求至少产生一次HTTP请求。
不同的HTTP协议版本具有不同的连接关系:HTTP1.0的TCP不能复用,HTTP1.1能顺序性TCP复用,HTTP2.0支持多路复用TCP复用。
2、请求限制与语法
Nginx的请求限制包括两种:limit_conn_module(连接频率限制);limit_req_module(请求频率限制)
连接频率限制语法:
Syntax:limit_conn_zone key zone=name:size;
Default:-
Context:http
Syntax:limit_conn zone number;
Default:-
Context:http,server,location
请求频率限制语法:
Syntax:limit_req_zone key zone=name:size rate=rate;
Default:-
Context:http
Syntax:limit_req zone=name [burst=number][nodelay];
Default:-
Context:http,server,location
3、演示
新建页面:/opt/app/code/1.html
<html> <head> <meta charset="utf-8"> <title>imooc1</title> </head> <body style="background-color:red;"> </body> </html>
修改配置文件 /etc/nginx/conf.d/default.conf
limit_conn_zone $binary_remote_addr zone=conn_zone:1m;
limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
location / { root /opt/app/code; index index.html index.htm; }
配置解析:对于同一个客户端IP地址过来的请求,限制为1秒发起一个。zone大小设置为1M。$remote_addr与$binary_remote_addr都表示客户端IP,$binary_remote_addr更节省空间。
重新加载配置文件
nginx -s reload -c /etc/nginx/nginx.conf
压测,总共发起40个请求,同时并发请求20个,每秒完成5983.55个请求
ab -n 40 -c 20 http://192.168.7.151/1.html
配置 limit_req zone=req_zone;
重新加载配置文件后,再次执行上面的压测语句:发现限制生效
配置 limit_req zone=req_zone burst=3 nodelay; 或者 limit_req zone=req_zone burst=3; 客户端在超过了指定的速率后遗留的3个放到下一秒执行,对客户端起到访问限速的作用,延迟响应,只有3个是延迟的其他的nodelay,直接返回。
重新加载配置文件后,再次执行上面的压测语句:发现限制生效。
配置 limit_conn conn_zone 1;限制服务端同一时刻只允许一个IP的连接过来。
重新加载配置文件后,再次执行上面的压测语句:发现限制生效。因为限制的是连接,一次连接可以进行多次请求。